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