On Tuesday, 1 April 2014 at 07:31:43 UTC, Frustrated 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.
I've tried using hasMember but since my object is cast to a
type of Object it never works.
The traditional OO approach would probably be this:
import std.stdio;
class A
{
static final void foo() { writeln("A.foo"); }
void bar() { foo(); }
}
class B : A
{
override void bar() { writeln("B.bar"); } // optional
}
class C : A {}
void main()
{
A a0 = new B; // or new C;
A a1 = new C; // or new C;
a0.bar(); //B.bar
a1.bar(); //A.foo
}
Also, bear in mind that polymorphism is one-way: you can call
base class methods through an inherited class reference, but not
the other way around.
interface A {}
class B : A
{
void bar() {}
}
void main()
{
A a = new B;
a.bar(); // Error: no property 'bar' for type 'A'
}