2013/9/28 Sven Barth <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. >
What If I make Clone virtual? If by adding "virtual" to Clone, the problem is solved, then what's the difference between virtual Clone and the method you provided? > === 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 This compiles, however, if I remove my version of TIntTree (i.e. implement a Clone in it and call parent's DoClone), then the main program does not compile, it says: demo2.lpr(20,13) Error: Incompatible types: got "TIntTree.TTree$LongInt" expected "TIntTree" I then can either: 1) add a Clone method to TIntTree and do a typecast inside it, as you said. 2) do a typecast in the main program, i.e. it2 := it1.Clone as TIntTree. So, I guess the problem is solved? I have two further questions: 1) Why class of TTree does not work in 2.6.2 but class of TSelfType worked? Is it a problem of generics in 2.6.2, or it is *not* related to generics? I feel that TSelfType is same as TTree? 2) What is the difference between the following: - it2 := TIntTree(it1.Clone); - it2 := it1.Clone as TIntTree; Where in the official document can I find the behavior/definition of "as"? Thanks a lot. Regards, Xiangrong
_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal