how is this considered hiding methods?

Andrej Mitrovic andrej.mitrovich at gmail.com
Sat Sep 22 01:38:40 PDT 2012


On 9/22/12, Andrej Mitrovic <andrej.mitrovich at gmail.com> wrote:
> using the alias

But I do think this can be further improved in the language. Take this
for example:

import std.stdio;

class Foo
{
    void meth(double) { writeln("Foo.meth"); }
}

class Bar : Foo
{
    alias super.meth meth;
    void meth(int) { writeln("Bar.meth"); }
}

class Doo : Bar
{
    alias super.meth meth;
    void meth(long) { writeln("Doo.meth"); }
}

void main()
{
    auto doo = new Doo;
    doo.meth(1);  // calls Bar.meth
}

Now let's say the Doo clas removes the meth overload and the alias:

class Foo
{
    void meth(double) { writeln("Foo.meth"); }
}

class Bar : Foo
{
    // gone
}

class Doo : Bar
{
    alias super.meth meth;
    void meth(long) { writeln("Doo.meth"); }
}

void main()
{
    auto doo = new Doo;
    doo.meth(1);   // now calls Doo.meth
}

We might have wanted the "super alias" in Doo to only work against the
Bar base class so the compiler can notify us if Doo.meth is removed.
The language doesn't have a way to warn us of this.

I would prefer if "super.alias" meant to take overloads of all base
classes into account and that we could use "ClassName.alias" to only
import the overload set of a specific base class. That way this would
trigger a CT error:

class Foo
{
    void meth(double) { writeln("Foo.meth"); }
}

class Bar : Foo
{
}

class Doo : Bar
{
    alias Bar.meth meth;  // error: no overload set in Bar
    void meth(long) { writeln("Doo.meth"); }
}


More information about the Digitalmars-d-learn mailing list