Differing implementations for a function in two interfaces
Hasan Aljudy
hasan.aljudy at gmail.com
Sat Apr 15 13:45:45 PDT 2006
BCS wrote:
> In article <e1riem$3jd$1 at digitaldaemon.com>, Hasan Aljudy says...
>
>>I didn't read/undertstand your entire post, but I think what you're
>>trying to achieve here can already be achieved through polymorphism.
>>
>>I think you just need to redeisgn the classes a little bit.
>>
>>
>
> I don't think that would (always) work. Consider the following:
>
> interface IA
> {
> int get();
> }
>
> interface IB
> {
> int get();
> }
>
> class C : IA, IB
> {
> public int i;
> // illegal but ...
> int get() { return i+1; } // get for IA
> int get() { return i+2; } // get for IB
> }
>
> void main()
> {
> auto obj = new C;
> IA a = obj;
> IB b = obj;
>
> obj.i = 0;
> writef(a.get, \n); // should print 1
> writef(b.get, \n); // should print 2
>
> obj.i = 2;
> writef(a.get, \n); // should print 3
> writef(b.get, \n); // should print 4
>
> }
>
> Both "a" and "b" are actually pointing to obj but calls to "get" using them are
> supposed to differ. Some types of this problem could be handled by deriving
> classes from C but not when the interfaces must actually be dealing with the
> same object.
>
> Cases like this could really happen if someone needs to implement two interfaces
> from different libraries in the same class.
>
>
I know, I'm saying, you can do this using polymorphism, along with a
redesign, invloving decoupling the get method from the C class.
class C
{
protected int i;
}
abstract class CGetter
{
abstract int get( C c );
}
class CA : CGetter
{
int get( C c )
{
return c.i + 1;
}
}
class CB : CGetter
{
int get( C c )
{
return c.i + 2;
}
}
void main()
{
auto obj = new C;
CA a = new CA;
CB b = new CB;
obj.i = 0;
writefln(a.get(c)); // should print 1
writefln(b.get(c)); // should print 2
obj.i = 2;
writefln(a.get(c)); // should print 3
writefln(b.get(c)); // should print 4
}
A bit more complicated (for this simple example), but you're doing the
same thing: creating new entries in a vtable, to choose different
functions at runtime.
More information about the Digitalmars-d-learn
mailing list