Множественное наследование в java - PullRequest
8 голосов
/ 11 августа 2009

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

Ответы [ 8 ]

16 голосов
/ 11 августа 2009

Это было дизайнерское решение Java. Вы никогда не получите это, так что не беспокойтесь об этом. Хотя MI может помочь вам сделать Mixins, это единственный хороший MI, который когда-либо сделает вас.

6 голосов
/ 11 августа 2009

Я читал, что большинство программистов неправильно используют множественное наследование. «Просто продолжайте и наследуйте от класса, просто чтобы повторно использовать код» - не лучшая практика в случае множественного наследования.

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

Я не думаю, что отсутствие множественного наследования в java (как в c ++) наложит ограничения на сопоставление вашего кода / дизайна приложения / проблемной области в классы.

3 голосов
/ 15 июня 2013

если Java поддерживает множественное наследование, это может повлиять на другие функции Java
рассмотрим метод super (), который используется для вызова конструктора суперкласса. Если в программе есть несколько суперклассов (из-за множественного наследования), то компилятор запутается в том, какой конструктор суперкласса должен быть вызван, и выдаст ошибку

2 голосов
/ 06 апреля 2012

Простота. Цитировать Том Синтес ,

Команда разработчиков Java стремилась сделать Java:

  • Простой, объектно-ориентированный и знакомый
  • Надежный и безопасный
  • Архитектура нейтральная и портативная
  • Высокая производительность
  • Интерпретируемый, резьбовой и динамический

Причины исключения множественного наследования из языка Java в основном проистекает из «простой, объектно-ориентированной и знакомой» цели. Как простой язык, создатели Java хотели язык, который наиболее Разработчики могут понять, без обширного обучения. Для этого они работал, чтобы сделать язык как можно ближе к C ++ (знакомо) без переноса ненужной сложности C ++ (просто).

По мнению дизайнеров, множественное наследование вызывает больше проблем и путаница, чем она решает. Таким образом, они сокращают множественное наследование от язык (так же, как они сокращают перегрузку операторов). Дизайнеры Большой опыт C ++ научил их, что множественное наследование просто не стоило головной боли.

1 голос
/ 27 ноября 2012

Java-дизайнеры решили это. Множественное наследование может быть смоделировано с использованием интерфейсов.

0 голосов
/ 01 ноября 2015

Это правда, что Java не использовала для поддержки множественного наследования реализации (только типа интерфейса). Это было дизайнерское решение.

Однако, начиная с Java 8, он поддерживает множественное наследование с использованием методов по умолчанию. Смотри http://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html:

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

0 голосов
/ 11 марта 2011

Проблема ромба возникает, когда несколько родительских классов определяют свои собственные реализации чего-либо, а дочерний класс этих двух должен иметь дело с неоднозначностью, какую реализацию использовать. Так что, если все классы в Java являются производными от Object, это единственный родительский класс. «Один родитель, несколько производных классов» - это не то же самое, что «Несколько родителей, один производный класс»

0 голосов
/ 11 августа 2009

Один простой ответ заключается в том, что все классы в Java являются производными от java.lang.Object IIRC. Таким образом, у вас будет всегда проблема с бриллиантом ...: -D

...