Feedback on Átila's Vision for D
Meta
jared771 at gmail.com
Sun Oct 20 17:11:27 UTC 2019
On Sunday, 20 October 2019 at 09:31:34 UTC, Max Samukha wrote:
> On Saturday, 19 October 2019 at 22:14:55 UTC, Meta wrote:
>
>>
>> It's not a defect. Interfaces have no state, so it doesn't
>> matter which is called. Java does the same thing.
>
> What do you mean by 'have no state'? If Java does the same
> thing, it does it wrong. Nominal typing is all about avoiding
> structural conflicts. Members coming from different nominal
> types should not be conflated.
Interfaces in D do not have any state, i.e., they're not allowed
to declare member variables that implementing classes inherit,
and they don't define any implementation for implementing classes
to inherit - they just define the interface (this has recently
changed in Java now that interfaces can define methods with a
default implementation, thus Java now provides a way to
disambiguate if two different interfaces declare default methods
with the same name).
Because classes do not inherit any state or implementation from
interfaces, if you have, say, the following class:
class ImplementsBoth: Display, Debug { void fmt(){} }
And you do `new ImplementsBoth().fmt()`, it really doesn't matter
whether the fmt you're calling is Display's fmt, or Debug's,
because there is no interface state or inherited implementation
that would change fmt's behavior by calling one or the other.
The fact that interfaces carry no state or default implementaion
is also why they don't have the diamond inheritance problem that
C++'s multiple inheritance can cause.
So semantically, collapsing Display.fmt and Debug.fmt into one is
perfectly valid. I agree it might be nice to allow disambiguating
in certain cases, but that would be an enhancement, not a bug.
https://en.m.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem
More information about the Digitalmars-d
mailing list