How to dynamically call class virtual method dynamically

Steven Schveighoffer schveiguy at yahoo.com
Tue Apr 1 05:20:06 PDT 2014


On Tue, 01 Apr 2014 03:31:41 -0400, Frustrated <Who at where.com> wrote:

> Basically in programming to interfaces I need to decide to call a  
> virtual method of an object if it exists else call a final method in the  
> interface:
>
> interface A
> {
>      static final void foo() { ... }
> }
>
> class B : A
> {
>      void bar() { ... }     // optional
> }
>
> class C : B
> {
>      void bar() { ... }     // optional
> }
>
> void main()
> {
>      A a = new B;  // or new C;
>
>      // if a.bar exists call it, else call foo
>      // code should work independent of the classes. (there might be  
> more)
> }
>
> The point of the code is simply to allow the class to implement bar  
> optionally but provide default behavior with foo. I need a way to  
> dynamically determine if bar exists and fall back on foo. This should be  
> possible.
>
> e.g., suppose
>
> class B : A { }
>
> then I would like to b.bar() to actually call A.foo() (since bar doesn't  
> exist in b).
>
> I guess the exist way would be to create an opDispatch and have it call  
> foo if bar is passed. This works great and does everything I need it to  
> except requires adding the code in the class which I can't have. Also  
> I'm not sure how it would work with virtual methods.

Detecting whether bar exists can only happen at compile time, since an  
instance of A has no mechanism to detect whether it has bar. D does not  
have very good runtime introspection, that would have to be built into the  
TypeInfo struct (the mechanism exists to do it, but it has never been used  
for that).

You could use this templates, but that would only work if the type of the  
derived class is known at compile time.

This problem could easily be solved by virtual methods with default  
implementation.

-Steve


More information about the Digitalmars-d-learn mailing list