On Sat, 29 May 2010, spir ☣ wrote:
Hello, Say I store class instances of various types in a TFPList. All happen to be descendants of same superclass C and each one has a specific method "text". When retrieving and writing an element, if they were all direct instances of C, I would do something like: element := C(list[index]); // casting back text := element.text; I cannot do that, even if elements all are *indirect* instances of C, because this calls C.text instead of the element's own proper text method. Which is wrong, indeed. So, I must cast elements back to their own type; but I have no idea how to do this. Doesn't the compiler store this information? After all, when an element is put into the list, its type is known. Is there a reason why retrieving an element does not cast it back to its original type automatically? Should I store element types manually in a parallel list? There must be a way to solve this issue, I guess...
There are 2 1. Make all descendents descendent of a super class that has a text property. 2. Make the "text" property published, and use RTTI to get/set it. uses typinfo; text:=GetStrProp(element,'text'); Or SetStrProp(Element,'text',AValue)
Side-question: it seems, when subclassing, that methods with same name and same parameters do not need any modifier keyword (such as "override" or "overload"). Eg I can have function text; in both a superclass C0 and a subclass C1 work as expected. Correct?
It depends on what you want to achieve. If you make it a static method, then the compiler will emit a warning "function Text hides method of parent class" (or something like it)If you make it virtual, then you must explicitly add "override" to override the implementation of the method.
Michael.
_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal