Нужна ясность в части реализации алмазной проблемы - PullRequest
0 голосов
/ 16 февраля 2020

Ответы на вопросы: почему множественное наследование невозможно?

Если в A есть метод, который B и C имеют переопределение, и D не переопределяет его, то какую версию метода наследует D : что из B, или что из C?

Хорошо. Fine

Почему это не относится к интерфейсам? Потому что это не реализовано.

Этот ответ меня смущает. Я видел много статей, рассказывающих о том, почему множественное наследование с классом невозможно, и они никогда не говорят о реализации. Когда мы задаем тот же вопрос об интерфейсах, они не go с одинаковыми логами c, и теперь они говорят, что код не реализован. Почему бы нам не go с одинаковыми логиками c? Его реализация является реальной проблемой здесь? Пожалуйста, обращайтесь только к этой части.

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Проблема ромба возникает, если B и C, каждый из которых содержит конфликтующие определения для унаследованного метода, переопределены D. Проблема не возникнет, если B и C наследуют методы без их переопределения, а D предоставил переопределения для метода, поскольку переопределение D будет влиять на B и C одинаково.

Если A, B и C являются интерфейсами, то ни B, ни C не смогут предоставить определения для методов A. Класс, который реализует оба интерфейса, может сделать это, но любое определение, которое он предоставляет для методов A, будет в равной степени применяться к определениям из B и C.

Другое важное отличие между интерфейсами и классами состоит в том, что при переопределении члена класса можно связать с родительским методом, но при реализации интерфейса никогда не будет родительского метода для цепочки.

1 голос
/ 16 февраля 2020

Интерфейс - это контракт, в котором указывается, какой метод должен реализовать класс, поэтому при вызове этого метода существует только одна реализация, в отличие от множественного наследования, когда компилятор не знает, какой метод взять.

При множественном наследовании

class A
{
    public void DoSomething() {}
}

class B
{
    public void DoSomething() {}
}

class C : A, B
{
    public override void DoSomething() {} // which DoSomething() is it?
}

В множественных интерфейсах

interface A
{
    void DoSomething();
}

interface B
{
    void DoSomething();
}

class C : A, B {
    public void DoSomething() { }
}

DoSomething() реализовано в классе C, поэтому договор с обоими интерфейсами выполнен.

...