2008-12-13 1 views
9

Можно создать дубликат:
What is the exact problem with multiple inheritance?Является ли множественное наследство злым?

Почему множественное наследование считается дурные во время реализации нескольких интерфейсов не является? Особенно когда считается, что интерфейсы - это просто чистые абстрактные классы?

(более или менее) дубликатWhat is the exact problem with multiple inheritance?, Multiple Inheritance in C#, и некоторые другие ...

ответ

27

Общей проблемой с множественным наследованием является «проблема с алмазами».

A 
/\ 
B c 
\/
    D 

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

Причина, по которой это не проблема с интерфейсами, состоит в том, что интерфейсы не имеют реализаций, поэтому, если A/B/C - все интерфейсы, тогда D выбирает, как реализовать методы A любым способом.

+2

Это не проблема, если вам требуется D для двусмысленности. – 2013-01-24 15:27:39

2

Как примирить, если А реализует метод г и б реализует метод называется г и у вас есть:

ребенок: a, b

сейчас, если код моего клиента вызывает новый child(). Z(). Какая реализация называется? Я не думаю, что его так много, как его злой он просто поднимает много липких точек и не дает никакого значения

+0

Эта проблема может быть легко решена, если компилятор требует переопределить метод z в дочернем классе. Кроме того, та же проблема возникает и на языках, где допускается множественное наследование интерфейса, если у вас есть 2 интерфейса с одним и тем же именем, но с другой подписью. – hariseldon78 2014-12-04 08:38:33

3

MI не столько зло, сколько очень сложное решение редкой проблемы. В большинстве случаев есть лучший способ сделать то же самое.

13

Это воспринимается как зло, потому что оно просто более сложное и вызывает больше проблем, чем обычно ожидают люди, особенно если базовые классы не являются чисто абстрактными (нет данных). Наследование алмазов можно решить с помощью виртуального наследования, где общая база разделяется. И компиляторы могут поймать вызовы подписи метода. Используемый хорошо, он может производить элегантные и сухие решения, которые в ином случае более сложны для реализации через интерфейс и композиции/делегации.

Один общий идиом MI в C++ предназначен для сложных конструкторов оболочек, где базовый конструктор должен быть сконструирован с нетривиальными объектами-членами, а так как базовые объекты должны быть сконструированы перед объектами-членами, трюк заключается в использовании MI (" base from member "idiom.), в противном случае вы должны использовать фабрику и другие шаги для выполнения такой конструкции, как Java (у Java нет MI для классов без интерфейса).

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