| Thread overview | |||||
|---|---|---|---|---|---|
|
July 14, 2017 Implementing interface in the class hierarchy | ||||
|---|---|---|---|---|
| ||||
According to language reference (part 'Interfaces') this code will not compile:
interface D
{
int foo();
}
class A : D
{
int foo() { return 1; }
}
class B : A, D <- Error: class B interface function 'foo' is not implemented
{
}
Because: 'A reimplemented interface must implement all the interface functions, it does not inherit them from a super class'.
Why?
Each B object 'is an' A object (and each cat 'is an' animal) so if A implements D, then B implements D too. Implementing D second time doesn't change the nature of A and B.
More over, another example (more practical because here, the D interface is going to be implemented only once):
interface D
{
int foo();
}
class A
{
int foo() { return 1; }
}
class B : A, D <- Error: class B interface function 'foo' is not implemented
{
}
Class A doesn't implement D, but it has the method satisfied the D interface.
Why I have to provide the explicit implementation of 'foo' in B class?
I cannot logically explain this property of Dlang's OOP. Anyone could?
Thanks in advance.
Arek
| ||||
July 14, 2017 Re: Implementing interface in the class hierarchy | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Arek | On 7/14/17 7:04 AM, Arek wrote: > According to language reference (part 'Interfaces') this code will not compile: > > interface D > { > int foo(); > } > > class A : D > { > int foo() { return 1; } > } > > class B : A, D <- Error: class B interface function 'foo' is not implemented > { > } > > Because: 'A reimplemented interface must implement all the interface functions, it does not inherit them from a super class'. > > Why? Not sure what the use case is. Effectively, this is the same: class B : A {} D d = new B; // works > Each B object 'is an' A object (and each cat 'is an' animal) so if A implements D, then B implements D too. Implementing D second time doesn't change the nature of A and B. > > More over, another example (more practical because here, the D interface is going to be implemented only once): > > interface D > { > int foo(); > } > > class A > { > int foo() { return 1; } > } > > class B : A, D <- Error: class B interface function 'foo' is not implemented > { > } This is a different story. I think it is technically possible for the compiler to make this connection (it needs to populate the I vtable with the right call w/ thunk), but I don't think there's a way to do it. This doesn't work: class B : A, D { alias A.foo foo; } Relevant enhancement request: https://issues.dlang.org/show_bug.cgi?id=2565 -Steve | |||
July 15, 2017 Re: Implementing interface in the class hierarchy | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Friday, 14 July 2017 at 12:31:49 UTC, Steven Schveighoffer wrote:
<cut>
> Relevant enhancement request:
> https://issues.dlang.org/show_bug.cgi?id=2565
>
> -Steve
So it looks like there are no rational arguments for such a language specification, and this behavior is derived from some aspect of the compiler implementation.
Thanks
Arek
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply