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