Действительно ли множественное наследование является злым? [дубликат]

Вот пример g: link, передающий одну пару имя-значение. Чтобы добавить несколько, просто добавьте запятую и вторую пару значений имени в квадратных скобках.

<g:link role="button" class="btn btn-success" action="details" params="${['folderNumber' : instance.fileFolderNumber]}" title="Details">Details</g:link>

Обратите внимание, что g: remoteLink устарела. Я перешел на использование JQuery для выполнения вызовов Ajax.

9
задан Community 23 May 2017 в 10:27
поделиться

4 ответа

Типичной проблемой со множественным наследованием является "ромбовидная проблема".

  A
 / \
B   c
 \ /
  D

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

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

28
ответ дан 4 December 2019 в 06:07
поделиться

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

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

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

13
ответ дан 4 December 2019 в 06:07
поделиться

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

3
ответ дан 4 December 2019 в 06:07
поделиться

Как делают Вы согласовываете, если реализации метод, названный z и b, реализует метод, названный z, и Вы имеете:

ребенок: a, b

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

2
ответ дан 4 December 2019 в 06:07
поделиться