reimplementing an interface in a derived class
Alex
sascha.orlov at gmail.com
Fri Jan 4 09:53:18 UTC 2019
On Friday, 4 January 2019 at 09:19:48 UTC, Simen Kjærås wrote:
> On Friday, 4 January 2019 at 08:40:04 UTC, Alex wrote:
>> class A
>> {
>> public:
>> int foo(){return 1;}
>> };
>> class B : public A
>> {
>> public:
>> int foo(){return 2;}
>> };
>
> In C++, methods are non-virtual by default. In D, they are
> virtual by default. Because of this, the two examples are
> different. In fact, D disallows overriding non-virtual,
> non-private functions, as specified in
> https://dlang.org/spec/function.html#virtual-functions. For
> private functions it does work, though:
>
Ha... got it!
Because final methods are allowed in interfaces, maybe this is
the answer to the OP...
> class A {
> private final int foo() { return 1; }
> }
> class B : A {
> final int foo() { return 2; }
> }
>
> unittest {
> assert((new A).foo == 1);
> assert((new B).foo == 2);
> assert((cast(A)(new B)).foo == 1);
> }
>
> Imagine you give me a box with an Animal in it. You know it's a
> Bird, but I only know it's an Animal of some kind.
>
> Case 1: I tell it to move() to the top of a tree. Would you
> expect it to climb or fly?
> (let's not get into penguins and other flightless birds right
> now, the OOP animal metaphor is strained enough as it is)
>
> Case 1 is overriding - Bird has defined how move() should work,
> and it will do that even if you only know it's an animal of
> some kind.
>
> This can be exemplified in D as:
>
> import std.stdio : writeln;
>
> abstract class Animal {
> abstract void move();
> }
>
> class Bird : Animal {
> override void move() {
> writeln("Flying.");
> }
> }
>
>
> unittest {
> (new Bird).move(); // Flying
> (cast(Animal)new Bird).move(); // Flying
> }
>
> --
> Simen
Case 2 is clear. I was wondering about the behavior in case 1:
not because of the override behavior, but because there is an
explicit cast in between.
I assume the move method of an Animal is not abstract, and
therefore I supposed, casting to this type explicitly should
restore this very non-abstract behavior. But this is not the case.
And the final/virtual thing above explains this to some extent,
too... I think...
More information about the Digitalmars-d-learn
mailing list