[fpc-pascal] How to know if a class implements a method

Joao Morais post at joaomorais.com.br
Fri May 18 16:24:47 CEST 2007


Hello Matt, thanks for your fast input.

Matt Emson wrote:

>> Any idea how I know if a class, in a class pointer, overrides a virtual
>> method? Eg:
> 
> <snip>
> 
>> vfooclass := tboo1;
>> // vfooclass doesn't implement sample.
>>
>> vfooclass := tboo2;
>> // vfooclass implements sample.
> 
> You need to implement a virtual method, even if it does nothing. Are you
> sure you're not meaning abstract method?

No, no... I just want to know if the class referenced by vfooclass 
overrides the "sample" method, implementing something different from the 
virtual implementation that, btw, isn't abstract and it's empty.

>> At this moment I know that:
>>
>> 1. I could cast a method pointer with tmethod if sample was a class
> method;
>> 2. I could cast this same method pointer if I had an instance of
> vfooclass.
>> But is there another way beyond creating an instance?
> 
> You can always hack the RTTI/VMT, but that might not be a safe way.

I though about this, dunno it's better than creating an useless instance.

> Might it be that you need to have a more complex inheritence tree? So add a
> few levels?

Even more complex? No, no! =)

This is a piece of an OPF framework. I want to know if a business class 
implement something in a virtual method. Such class belongs to the 
application and the framework doesn't have direct access to it. If the 
class doesn't implement I don't need to retrieve an instance from the 
database, btw an expensive task for absolutely nothing.

So, at this moment I know that I can:

1. Use a safe, magic and efficient way, but I need to know if it exists;
2. Create a "light" instance using vfooclass.NewInstance method;
3. hack the vmt.

Which approach do you use?

Thanks.

--
Joao Morais




More information about the fpc-pascal mailing list