Java не позволяет наследовать от нескольких классов (все же он позволяет наследовать от нескольких интерфейсов.), я знаю, что он очень близок к классической проблеме с алмазами. Но мои вопросы: почему Java не допускает множественное наследование, например, С++, когда нет двусмысленности (и, следовательно, нет шансов на проблему с алмазом), наследуя от нескольких базовых классов?
Множественное наследование в java
Ответ 1
Это было конструктивное решение Java. Вы никогда не получите его, так что не беспокойтесь о нем слишком много. Хотя MI может помочь вам сделать Mixins, что единственный хороший MI когда-нибудь сделает вас.
Ответ 2
Я читал, что большинство программистов не используют множественное наследование надлежащим образом. "Просто продолжайте и наследуйте класс, чтобы повторно использовать код" - это не лучшая практика в случае множественного наследования.
Многие программисты не знают, когда использовать простое наследование в большинстве случаев. Множественное наследование должно использоваться с осторожностью и только если вы знаете, что делаете, если хотите иметь хороший дизайн.
Я не думаю, что отсутствие множественного наследования в java (как в С++) будет помещать ограничения в ваше кодовое/прикладное проектирование/сопоставление проблемных областей в классы.
Ответ 3
Простота. Чтобы процитировать Tom Sintes,
Команда разработчиков Java стремилась сделать Java:
- Простой, объектно-ориентированный и знакомый
- Надежный и безопасный
- Архитектура нейтральная и портативная.
- Высокая производительность
- Интерпретированный, поточный и динамический
Причины исключения множественного наследования с языка Java в основном вытекают из "простой, объектно-ориентированной и знакомой" цели. В виде простой язык, разработчики Java хотели, чтобы язык, который больше всего разработчики могли понять без обширной тренировки. С этой целью они работал над тем, чтобы сделать язык как можно более похожим на С++ (знакомым) без переноса С++ ненужной сложности (простой).
По мнению дизайнеров, множественное наследование вызывает больше проблем и путаница, чем она решает. Таким образом, они сокращают множественное наследование от (так же, как они сокращают перегрузку оператора). Конструкторы, обширный опыт на С++ научил их, что множественное наследование просто не стоило головной боли.
Ответ 4
если java поддерживает множественное наследование, тогда это может повлиять на другие функции java
рассмотрим метод super(), который используется для вызова super class constructor.if. Программа имеет несколько суперклассов (из-за множественного наследования), тогда компилятор смущается о том, какой конструктор суперкласса следует вызывать и вызывать ошибку
Ответ 5
Дизайнеры Java решили это сделать. Многократное наследование можно моделировать с помощью интерфейсов.Ответ 6
Один простой ответ заключается в том, что все классы в Java получают из java.lang.Object IIRC. Итак, у вас всегда есть проблема с алмазом...:-D
Ответ 7
Верно, что Java не использовалась для поддержки множественного наследования реализации (только для типа i.e. interface). Это было конструктивное решение.
Однако, поскольку Java 8 поддерживает множественное наследование с использованием методов по умолчанию. См. http://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html:
Множественное наследование реализации - это способность наследовать определения методов из нескольких классов. Проблемы возникают с этим тип множественного наследования, например, конфликты имен и двусмысленность.... Методы по умолчанию вводят одну форму множественного наследования реализация.
Ответ 8
Проблема с алмазом возникает, когда несколько родительских классов определяют свои собственные реализации чего-то, а дочерний класс этих двух имеет дело с двусмысленностью реализации. Итак, что, если все классы в Java получают от Object, это один родительский класс. "Одиночный родитель, несколько производных классов" - это не то же самое, что "Несколько родителей, один производный класс"