hijacking override from template mixin

Ivan Kazmenko via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jun 9 08:54:20 PDT 2014


The D language pays certain attention to avoiding hijacking [1].  
So I was surprised when I hijacked a function override from a 
template mixin by mistake.  Here is a commented example.  The 
comments explain the relevant part of the life cycle of the 
program.

-----
// Start with class A with method fun returning "A".
class A {
     string fun () {return "A";}
}

// Subclass B will return "B" instead.
class B: A {
     override string fun () {return "B";}
}

// Turns out a common need is to return "MT",
// so we will create a mixin template MT for it
// to reduce boilerplate.
mixin template MT () {
     override string fun () {return "MT";}
}

// We use MT in our new subclass C.
class C: A {
     mixin MT;
}

// Both a mixed-in override and a regular one
// by a refactoring mistake, what happens?
class D: A {
     mixin MT;
     override string fun () {return "D";}
}

// Let's find out.
void main () {
     import std.stdio;
     writeln (new B ().fun ()); // B
     writeln (new C ().fun ()); // MT
     writeln (new D ().fun ()); // D, not MT
}
-----

I'd expect a "multiple overrides of same function" error, much 
like if I just paste the mixin code by hand.  Is that a bug or 
working by design?  In the latter case, please explain the 
reasoning.

Also, if there is a "better" tool than a template mixin in the 
situation explained in the comments, please point me to it.

[1] http://dlang.org/hijack.html


More information about the Digitalmars-d-learn mailing list