Re: [fpc-pascal] {SOLVED} casting back a pointer to original type

2010-05-30 Thread spir ☣
On Sat, 29 May 2010 16:54:44 -0700
Andrew Hall andrew.h...@shaw.ca wrote:

 On 29 May 10, at 15:26 , spir ☣ wrote:
  I cannot do that. C0 (and all classes) instances need a text method. I also 
  cannot have 2 methods (one static, one virtual) with different names. It's 
  a basic feature, always called with the same name. Like getItem for a 
  hierarchy of collections: every collection must have it, and always under 
  the same name, so that any client can rely on it.
 
 David is not suggesting you have two methods with different names - his 
 example is demonstrating the different behaviour of static and virtual 
 methods. Calling a static method is determined at compile time - the compiler 
 must use the actual class of your variable (or cast) - so your descendent 
 methods will never be called.  This is what is happening to you at the moment 
 - only your base class Text method is called.  Calling a virtual method is 
 determined at runtime based upon the actual class held by the variable (cast) 
 - it seems this is exactly what you need.  Set your base class Text method as 
 virtual, and each descendent class Text method as override - your code should 
 then function as you require...
 
element := C(list[index]);
text := element.text;
 
 if the pointer in list[index] is C1, C1.Text will be called.
 
 Regards,  
 Andrew.

Thank you very much, David  Andre. Sorry, David, I had not understood the 
intent of your example post. Your comment and Andre's clarified everything.
OK, I lurred myself by taking words too literally. I thought virtual meant 
unimplemented, to be implemented in sub-classes. So, for me, this could not 
apply to my case, since supaer-classes also need the method to be implemented.
Just did a fast trial: works fine.

Denis


vit esse estrany ☣

spir.wikidot.com
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] {SOLVED} casting back a pointer to original type

2010-05-30 Thread David Emerson
 OK, I lurred myself by taking words too literally. I thought virtual meant
 unimplemented, to be implemented in sub-classes.

unimplemented = abstract virtual method

type
  something = class
procedure do_something; virtual; abstract;
end;

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