2010-11-08 1 views
2

Возможных Дубликаты:
Why C# doen't support multiple inheritance
Should C# include multiple inheritance?Почему интерфейс поддерживает множественное наследование и класс Doesnt в C#

мне нравится то, что является причиной для поддержки интерфейса множественного наследования и класса оленьей кожи поддержки

+0

То же [Почему C# doen't поддерживает множественное наследование] (http://stackoverflow.com/questions/2865302/why-c-doent-support-multiple-inheritance). –

+0

, который является дубликом [Если C# включает множественное наследование?] (Http://stackoverflow.com/questions/191691/should-c-include-multiple-inheritance) –

+0

@Marc, он был закрыт как таковой, но я не знаю Я действительно согласен. Почему это было спроектировано именно так и было ли правильным дизайном разные проблемы. –

ответ

0

Мне было бы очень интересно получить более авторитетный ответ, но вот мой прием.

В языках, поддерживающих множественное наследование, ключевая двусмысленность, которая (возможно) неудовлетворительно разрешена, происходит, когда вы выполняете подкласс из двух типов, которые определяют метод с той же сигнатурой. Например:

public class BaseClass1 
{ 
    public string SomeMethod() 
    { 
     return "Implementation1"; 
    } 
} 

public class BaseClass2 
{ 
    public string SomeMethod() 
    { 
     return "Implementation2"; 
    } 
} 

public class MySuclass : BaseClass1, BaseClass2 
{ 
} 

Теперь, что возвращается?

MySubclass mySubclass = new MySubclass(); 
string s = mySubclass.SomeMethod(); 

В C# явная реализация интерфейса позволяет легко решить эту проблему с помощью definining как. После преобразования BaseClass1 и BaseClass2 интерфейсов, мы можем иметь

public class MySuclass : IBaseClass1, IBaseClass2 
{ 
    string IBaseClass1.SomeMethod() 
    { 
     return "Implementation1"; 
    } 

    string IBaseClass2.SomeMethod() 
    { 
     return "Implementation2"; 
    } 
} 

Ключа, конечно в том, что нет никакой двусмысленности с этим синтаксисом, как это не возможно получить доступ к SomeMethod без первой отливки цели либо IBaseClass1 или IBaseClass2.

8

Я предпочел бы «отрицать» ваше утверждение .. «интерфейс поддерживает множественное наследование».

Интерфейс НЕ является наследованием, это просто «контракт» службы/поведения, которым обладает класс.

Внедряя интерфейс, класс не наследует ничего как таковое.

И поскольку класс/сущность может связываться с несколькими контрактами (поведением), мы можем реализовать несколько интерфейсов в классе.

1

Потому что это концептуально две совершенно разные вещи.

Если вы наследуете от класса, вы наследуете код базового класса. Если вы реализуете (не наследуете!) Интерфейс, вы вынуждаете свой класс реализации иметь предопределенные подписи метода/события/свойства.

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

Или, другими словами: Это реализация Простая композиция по наследованию принцип дизайна.

Томас