override(T)

Max Samukha spambox at d-coding.com
Thu Sep 24 07:52:00 PDT 2009


On Thu, 24 Sep 2009 08:30:46 -0500, Andrei Alexandrescu
<SeeWebsiteForEmail at erdani.org> wrote:

>Walter and I discussed last night about contravariance and all and could 
>not find a compelling argument in favor of implementing contravariant 
>arguments right now. The feature is nontrivial to implement, potentially 
>surprising, and has a number of odd corner cases.
>
>One feature that does get requested often in C++ and Java is the ability 
>to choose which class/interface contains the method you want to 
>override. Consider:
>
>interface Lottery {  void draw();  }
>interface Figure {  void draw();  }
>
>class LotterySimulation : Lottery, Figure {
>     override void draw();
>}
>
>Right now draw() overrides both methods, but you'd want to override them 
>separately. You could do so through an intermediate interface:
>
>class Figure2 : Figure {  void draw2() { return draw(); }  }
>class LotterySimulation : Lottery, Figure2 {
>     override void draw();
>     override void draw2();
>}
>
>There are a few problems with this, among which the fact that 
>LotterySimulation now cannot inherit another class; the one class slot 
>was occupied by Figure2.
>
>So I was thinking of this:
>
>class LotterySimulation : Lottery, Figure {
>     override(Lottery) void draw();
>     override(Figure) void draw();
>}
>
>This is easy to implement, scales well, and has good real world uses. 
>What say you?
>
>
>Andrei

It would be a welcome addition. C# calls this feature 'explicit
interface implementation' and has a different syntax:

>class LotterySimulation : Lottery, Figure {
>     void Lottery.draw() {};
>     void Figure.draw() {};
>}

The functions cannot be called through an instance of the class,
only through the interfaces.

In D:

auto ls = new LotterySimulation;
ls.draw();

Which 'draw' will be called?



More information about the Digitalmars-d mailing list