2009-08-11 3 views
8

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

+2

Если вы хотите, чтобы mixins (= хорошие части MI) на языке jvm, взгляните на scala. –

+0

По моему опыту, множественное наследование может сделать очень хрупкий код. Использование интерфейсов намного более здорово. Если вы хотите повторно использовать логику реализации, используйте делегирование. Современные IDE, такие как Eclipse, упрощают делегирование работы из одного класса в другой. – JohnnySoftware

+0

Для тех, кто ищет подробную статью о «Mixins», [здесь один] (http://csis.pace.edu/~bergin/patterns/multipleinheritance.html). Как говорится в статье, требуется только 1 интерфейс, если классы не нуждаются в услугах друг от друга. Если это так, просто прочитайте 2-й раздел. – MattC

ответ

16

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

6

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

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

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

0

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

+0

Не совсем. Родители-> ляющего> Object. Таким образом, родитель расширяет Child, Child extends Object, он просто не написан явно в последнем случае, поскольку он подразумевается автоматически. –

+0

@Massa: Проблема с алмазом возникает, когда существует множественная реализация в нескольких базовых классах (из которых получен дочерний класс) того же метода. Если мы не переопределяем методы, определенные в классе java.lang.Object, то по существу это не приводит к проблеме двусмысленности и алмаза. –

+0

«Если мы не переопределяем методы, определенные в java.lang.Object», я переопределяю toString, hashcode и равен гораздо чаще, чем я хочу, чтобы множественное наследование –

-1

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

+0

№ «проблема с алмазами» относится к нескольким базовым классам, использующим базовый класс, а не к тем же именам. – curiousguy

2

Простота. Цитирую Tom Sintes,

Дизайнерская команда Java стремилась сделать Java:

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

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

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

1

Разработчики Java решили, что. Использование множественного наследования можно использовать с помощью интерфейсов.

2

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

+0

исправьте меня, если я ошибался –

0

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

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

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

+0

Также может возникнуть конфликт имен от наследования «интерфейсов» (вырожденных классов). – curiousguy

 Смежные вопросы

  • Нет связанных вопросов^_^