2010-08-09 3 views
4

Можно создать дубликат:
Multiple Inheritance in C#Множественное наследование не поддерживается в dotnet. Но поддерживает несколько интерфейсов?

Множественное наследование не поддерживается в DotNet. Но поддерживается несколько интерфейсов. Почему такое поведение существует. Любые конкретные причины?

ответ

1

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

Реализация нескольких интерфейсов, однако, не имеет таких проблем. Если два интерфейса определяют один и тот же метод, и вы на самом деле пытаетесь их реализовать, ваш код даже не будет компилироваться (хотя я не уверен, что вы можете явно реализовать их и удовлетворить требованиям компилятора).

+0

Вы можете явно определить их как –

+0

При реализации метода, который определяют оба интерфейса, не должно быть ошибок компилятора. – Dienekes

0

Опасность при множественном наследовании конкретных классов заключается в том, что существует поиск хранилища и виртуального метода, который должен быть согласован между двумя или более родителями данного класса. Особенно сложно, когда есть общие предки. Но интерфейсы определяют только то, что должен выглядеть класс, а не то, как его нужно реализовать, и гораздо проще сделать класс похожим на разные вещи, чем сделать это be много разных вещей. Для двух интерфейсов может потребоваться метод int Foo(), и реализующий класс может безопасно использовать оба интерфейса и реализовать Foo(), не вызывая головных болей, для которых базовое Foo() переопределить и т. Д.

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

Есть, конечно, много других причин, почему множественное наследование плохо.

4

Вы можете имитировать множественное наследование с использованием интерфейсов. Если разрешено множественное наследование с классами, это приведет к Diamond problem.
По причинам множественное наследование не поддерживается, я предлагаю вам прочитать Why doesn't C# support multiple inheritance?

Различные языки на самом деле имеют разные ожидания для того, как М. И. работ. Например, как разрешены конфликты и объединены ли дублирующие базы . Прежде чем мы сможем реализовать MI в среде CLR, мы должны сделать обзор всех языков, цифра из общих понятий и принять решение , как выразить их в нейтрально. Мы бы также должны решить, принадлежит ли MI в CLS, и что это означало бы для языков, которые не хотят этого понятия (предположительно, VB.NET, например). Of Конечно, это тот бизнес, который мы находимся в , как обычное время выполнения, но мы еще не сделали этого для MI .

Число мест, где MI действительно Соответствующий на самом деле довольно маленький. Во многих случаях наследование может быть выполнено . В других случаях вам может быть , способным использовать инкапсуляцию и делегирование . Если бы мы добавили немного отличную конструкцию, например, mixins, было бы действительно больше мощным?

Множественное наследование реализации вводит много сложностей в реализацию . Эта сложность удары литья, макет, рассылка, доступ к полям, сериализация, личность сравнение, проверяемость, отражение, дженерики и, возможно, много других мест.

1

Поскольку интерфейсы не в детали реализации, они знают только , какие операции объект может сделать. Множественное наследование затруднено, когда существует два разных варианта реализации для метода с такой же сигнатурой как в базовых классах . Но в случае интерфейса как интерфейс может определить общий метод с такой же сигнатурой, но они не выполняются на уровне интерфейса , они только реализованы объекта или типа, которые реализуют как интерфейсы. Здесь , хотя есть два разных интерфейса, определяющих два метода с одинаковыми сигнатурами, объект предоставляет общую реализацию , удовлетворяющую как методам в обоих интерфейсах. Так нет никакой двусмысленности между реализациями, оба метод имеет общих реализации, следовательно, вы можете иметь множественное наследование в случае интерфейсов.

0
java supports syntactical multiple inheritance....java does not supports implementation of multiple inheritance... 

some people says java supports multiple inheritance through interfaces ...but its not correct here the explanation: 

inheritance :: 

getting the properties from one class object to another class object.. 

Class A{} 

Class B extends A {} 

here object of class A getting the properties(methods/functions/ & data members/class variables) 

why java does not supports multiple inheritance using classes: 

Class A{} Class B{} Class C extends A,B{} X--this statement causes error because Class A getting object of object class from both sides A and B... 

every java class by default extending Object of object class...and Object of object class is the root object means super class for all classes... 

but here Class c having two super classes of object...so giving error...means java does not support multiple inheritance by using classes.. 

is java supports multiple inheritance using Interfaces:: 

because of this interface concept only few of us saying that java supports multiple inheritance....but its wrong.. 

here the explanation:: 

interface A{} 

interface B{} 

interface C implements A , B{} 

(or) interface A{} 

interface B{} 

Class C implements A , B{} 

here its look like multiple inheritance but ..... 

inheritance means getting the properties from one class object to another class object.. 

here in interface concept we are not at all getting any properties rather we are implementing the unimplemented methods of interface in class... 

so inheritance and intefaces are quite opposite... 

so finally java supports only syntax of multiple inheritance does not supports implementation of multiple inheritance.... 

inheritance is like debit and interface is like credit....but interface has its own importance in other concepts like server side programming... 
2

да наследование означает получение свойств от одного объекта класса другого объекта класса ..

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

так и наследование intefaces совсем наоборот ...

так, наконец, Java поддерживает только синтаксис множественного наследования не поддерживает я mplementation множественного наследования ....

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

Смежные вопросы