Java не разрешает наследование от нескольких классов (все же допускает наследование от нескольких интерфейсов), я знаю, что это очень похоже на классическую проблему с алмазом. Но мои вопросы: почему java не допускает множественного наследования, такого как C ++, когда нет двусмысленности (и, следовательно, нет шансов на проблему с бриллиантом) при наследовании от нескольких базовых классов?
Множественное наследование в Java
Ответы (8)
Это было дизайнерское решение Java. Вы никогда этого не получите, так что не беспокойтесь об этом слишком сильно. Хотя MI может помочь вам создавать миксины, это единственный хороший MI, который когда-либо сделает вам.
Я читал, что большинство программистов неправильно используют множественное наследование. «Просто продолжайте и наследуйте от класса, чтобы повторно использовать код» - не лучшая практика в случае множественного наследования.
Многие программисты не знают, когда в большинстве случаев использовать простое наследование. Множественное наследование следует использовать с осторожностью и только в том случае, если вы знаете, что делаете, если вы хотите иметь хороший дизайн.
Я не думаю, что отсутствие множественного наследования в java (как в C ++) наложит ограничения на ваш код / дизайн приложения / отображение проблемной области в классы.
если java поддерживает множественное наследование, тогда это может повлиять на другие функции java. Рассмотрим метод super (), который используется для вызова конструктора суперкласса. если программа имеет несколько суперклассов (из-за множественного наследования), то компилятор запутается, какой суперкласс конструктор класса должен быть вызван и выдать ошибку
Простота. Чтобы процитировать Тома Синтеса,
Команда разработчиков Java стремилась сделать Java:
- Простой, объектно-ориентированный и знакомый
- Надежный и безопасный
- Архитектура нейтральная и портативная
- Высокая производительность
- Интерпретируемый, многопоточный и динамический
Причины отказа от множественного наследования в языке Java в основном связаны с «простой, объектно-ориентированной и знакомой» целью. Создателям Java как простого языка был нужен язык, который большинство разработчиков могло бы понять без серьезной подготовки. С этой целью они работали над тем, чтобы сделать язык как можно более похожим на C ++ (знакомым), не перенося излишнюю сложность C ++ (простой).
По мнению дизайнеров, множественное наследование вызывает больше проблем и путаницы, чем решает. Таким образом, они сокращают множественное наследование от языка (так же, как они сокращают перегрузку операторов). Обширный опыт дизайнеров C ++ научил их, что множественное наследование не стоит головной боли.
Так решили Java-дизайнеры. Множественное наследование можно моделировать с помощью интерфейсов.
Один простой ответ заключается в том, что все классы в Java являются производными от java.lang.Object IIRC. Итак, у вас будет всегда проблема с бриллиантом ... :-D
Верно, что Java не использовалась для поддержки множественного наследования реализации (только типа, то есть интерфейса). Это было дизайнерское решение.
Однако, начиная с Java 8, он поддерживает множественное наследование с использованием методов по умолчанию. См. http://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html:
Множественное наследование реализации - это возможность наследовать определения методов от нескольких классов. С этим типом множественного наследования возникают проблемы, такие как конфликты имен и неоднозначность. ... Методы по умолчанию представляют одну из форм множественного наследования реализации.
Проблема ромба возникает, когда несколько родительских классов определяют свои собственные реализации чего-либо, а дочерний класс этих двух должен иметь дело с неоднозначностью того, какую реализацию использовать. Так что, если все классы в Java являются производными от Object, это единственный родительский класс. «Единственный родитель, несколько производных классов» - это не то же самое, что «Несколько родителей, один производный класс».