On Thu, 24 Sep 2009 08:30:46 -0500, Andrei Alexandrescu <seewebsiteforem...@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?