Multiple subtyping with alias this and nested classes

Yigal Chripun yigal100 at gmail.com
Sun Oct 4 03:31:25 PDT 2009


Max Samukha Wrote:

> On Sun, 04 Oct 2009 00:10:30 +0200, Yigal Chripun <yigal100 at gmail.com>
> wrote:
> 
> >
> >class FlippingBlipper : IBlipper, IFilpper
> >{
> >     mixin Flipper F;
> >     mixin Blipper B;
> >     alias F.nameCollision nameCollision;
> >}
> >
> 
> The problem is that IBlipper.nameCollision is totally unrelated 
> to IFlipper.nameCollision (for example, if the interfaces/mixins come
> from third-party libraries, whose developers don't know or care
> about each other, e.g. Tango/Phobos :P). That's why either
> nameCollision must have its own implementation.
> 
> In current D:
> 
> auto fb = new FlippingBlipper;
> IFlipper f = fb;
> IBlipper b = fb;
> f.nameCollision;
> b.nameCollision;
> 
> Both calls are dispatched to the same implementation (the one provided
> by Flipper template), which is incorrect and undesirable.
> 
> >I wonder if the following would work:
> >
> >class FlippingBlipper : IBlipper, IFilpper
> >{
> >     mixin Flipper IFilpper;
> >     mixin Blipper IBlipper;
> >}
> >
> >
> 
> I don't think so.

I see. What you want is non-virtual MI. 
I don't think that allowing the derived class to have two distinct implementations for the same function prototype is a good idea. 
Eiffel handles this by giving the programmer controls to select features and rename them in the derived class which I think is better. 

// hypothetical syntax example
class FlippingBlipper : IBlipper, IFilpper {
     mixin Flipper F;
     mixin Blipper B;
     // rename the inherited interface functions 
     alias IBlipper.nameCollision boo;
     alias IFilpper.nameCollision foo;
    // implement the now two distinct functions
   void foo() { F.nameCollision(); }
   void boo() { B.nameCollision(); }
}

you can further subtype and the derived foo & boo will override the respective interfaces. 




More information about the Digitalmars-d mailing list