On Mon, 21 Aug 2006 14:30:06 +0000
Albert Zeyer <[EMAIL PROTECTED]> wrote:
> > > I think, RTTI is very powerfull and there should be a way to do
> > > the same as above without a virtual constructor. But is it clean?
> >
> > To use RTTI you must derive from TPersistent or use the {$M+}
> > directive.
> >
> >
> > > In practice, I have a abstract base class with a function like
> > > this:
> > >
> > > function TMyBase.CreateCopy(): TMyBase;
> > > begin
> > > Result := Self.ClassType.Create(); // this doesn't work because
> > > ClassType is a TClass
> > > // TODO: fill the result with same data ...
> > > end;
> >
> > With TPersistent it would work like this
> > TMyBase = class(TPersistent)
> > public
> > function CreateCopy: TMyBase;
> > procedure Assign(Source: TPersistent); override;
> > end;
> >
> > it would be
> > function TMyBase.CreateCopy: TMyBase;
> > begin
> > Result := TMyBaseClass(Self.ClassType).Create;
> > Result.Assign(Self);
> > end;
> >
> > Every class must override the Assign method to copy all added
> > values.
> >
>
> But in this case, it would also not call the constructor of my
> inherited classes.
Why not? Did you test it?
> The assignment of the data inside the object is
> not the problem, I have other virtual functions I can use for this.
> But it is important, that the constructor of my inherited class is
> also called because it does some important and needed init-work
> (which depends on the inherited class).
>
>
> > Another possibility:
> > Use TComponent as base class. Then you can copy without writing the
> > Assign procedures. The IDE uses this. It is much
> > slower than the Assign approach.
> >
>
> Performance is important in my case. I will have very much of this
> objects.
>
> It seems that virtual constructors are the only possibility.
Mattias
_________________________________________________________________
To unsubscribe: mail [EMAIL PROTECTED] with
"unsubscribe" as the Subject
archives at http://www.lazarus.freepascal.org/mailarchives