ОК, почитаем классиковБуч (Ч. I гл. 3)Лирика
Цитата:Небходимость множественного наследования в ООП остается предметом горячих споров (это он о нас, прим. ред.). По нашему опыту, множественное наследование - как парашют: как правило, он не нужен, но, когда вдруг он понадобится, будет жаль, если его не окажется под рукой.
Критерии
Цитата:В действительности, это - лакмусовая бумажка для множественного наследования. Если мы составим структуру классов, в которой конечные классы (листья) могут быть сгруппированы в множества по разным ортогональным признакам и эти множества перекрываются, то это служит признаком невозможности обойтись одной структурой наследования, в которой бы существовали какие-то промежуточные классы с нужным поведением.
Проблемы
Цитата:Проектирование структур классов с множественным наследованием - трудная задача, решаемая путем последовательных приближений. Есть две специфические проблемы - как разрешить конфликты имен между суперклассами и что делать с повторным наследованием.
Решения
Цитата:Борются с этим конфликтом тремя способами. Во-первых, можно считать конфликт имен ошибкой и отвергать его при компиляции (так делают Smalltalk и Eiffel). Во-вторых, можно считать, что одинаковые имена означают одинаковый атрибут (так делает CLOS). В третих, для устранения конфликта разрешается добавить к именам префиксы, указывающие имена классов, откуда они пришли. Такой подход принят в С++".
Ромбы
Цитата:Проблема повторного наследования решается тремя способами.
Во-первых, можно его запретить, отслеживая при компиляции. Так сделано в языках Smalltalk и Eiffel. Во-вторых, можно явно развести две копии унаследованного элемента, добавляя к именам префиксы в виде имени класса-источника (это один из подходов, принятых в C++). В третьих, можно рассматривать множественные ссылки на один и тот же класс, кок обозначающие один и тот же класс. Так поступают в C++, где повторяющийся суперкласс определяется как виртуальный базовый класс. Виртуальный базовый класс появляется, когда какой-либо подкласс именует другой класс своим суперклассом и отмечает этот суперкласс как виртуальный, чтобы показать, что это - общий (shared) класс.
Аналогично, в языке CLOS повторно наследуемые классы "обобществляются" с использованием механизма, называемого список следования классов. Этот список заводят для каждого нового класса, помещая в него сам этот класс и все его суперклассы без повторений на основе следующих правил:
- класс всегда предшествует своему суперклассу
- каждый класс сам определяет порядок следования своих непосредственных родителей
Ну и т.д.
Про жаву мы уже знаем.