On 29.09.2013 05:49, Xiangrong Fang wrote:
2013/9/28 Sven Barth <pascaldra...@googlemail.com
<mailto:pascaldra...@googlemail.com>>

    On second sight your solution is not correct, because you are using
    Clone inside your parent class which would not use the (non-virtual)
    Clone you created.

    I've now played around with 2.6.2 myself and this should solve this
    problem:

    === code begin ===

    type
       generic TTree<T> = class
       private type
         TSelfType = TTree;
         TSelfClass = class of TSelfType; // earlier I suggested TTree
    which 2.6.2 does not support=== code end ===


​I think this solution only fixed the problem with 2.6.2 that you have
to use TSelfType, but the logic is still not correct.

Using your modified version, I try to achieve some complex Clone​
​strategy, for example, either one of the following:

1) the descendant has added a field other than Data that needs to be cloned;
2) the clone is "non-verbatim", it will multiple Data by 2 when cloning.

Let's use the 2nd one as an example, the following does not work:

type
   TIntTree = class(specialize TTree<Integer>)
   public
     function Clone: TIntTree;
   end;

function TIntTree.Clone: TIntTree;
begin
   Result := TIntTree(inherited Clone);
   Result.Data *= 2;
end;

It only multiple the ROOT node of the cloned tree, not every node.

I would suggest you to add an additional protected virtual method to TTree<> which is called from TTree<>.Clone and you override that in your descendant classes.

Regards,
Sven

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to