2009-08-11 19 views
8

Java erlaubt keine Vererbung von mehreren Klassen (noch erlaubt es die Vererbung von mehreren Schnittstellen.), Ich weiß, es ist sehr inline mit klassischen Diamant-Problem. Aber meine Fragen sind, warum Java keine Mehrfachvererbung wie C++ zulässt, wenn es keine Mehrdeutigkeit gibt (und daher keine Chancen auf ein Diamantproblem), wenn er von mehreren Basisklassen erbt?Mehrere Vererbung in Java

+2

Wenn Sie Mixins (= die guten Teile von MI) in einer jvm-Sprache wollen, werfen Sie einen Blick auf scala. –

+0

Nach meiner Erfahrung kann Multiple-Vererbung für sehr spröden Code sorgen. Die Verwendung von Schnittstellen ist viel gesünder. Wenn Sie die Implementierungslogik erneut verwenden möchten, verwenden Sie delegation. Moderne IDEs wie Eclipse machen es einfach, Arbeit von einer Klasse zur anderen zu delegieren. – JohnnySoftware

+0

Für alle, die einen ausführlichen Artikel über 'Mixins' suchen, [hier ist einer] (http://csis.pace.edu/~bergin/patterns/multipleinheritance.html). Wie der Artikel sagt, wird nur 1 Schnittstelle benötigt, wenn die Klassen keine Dienste voneinander benötigen. Wenn dies der Fall ist, lesen Sie einfach den 2. Abschnitt. – MattC

Antwort

16

Es war ein design decision von Java. Du wirst es nie bekommen, also sorge dich nicht zu sehr darüber. Obwohl MI Ihnen helfen könnte, Mixins zu machen, ist das der einzige gute MI, der Sie jemals tun wird.

6

Ich habe gelesen, dass die meisten Programmierer keine Mehrfachvererbung auf eine ordnungsgemäße Weise verwenden. "Gehen Sie einfach vor und erben Sie von einer Klasse, nur um Code wiederzuverwenden" ist im Falle der Mehrfachvererbung nicht die beste Vorgehensweise.

Viele Programmierer wissen in den meisten Fällen nicht, wann sie die einfache Vererbung verwenden sollen. Mehrfachvererbung muss mit Vorsicht verwendet werden und nur wenn Sie wissen, was Sie tun, wenn Sie ein gutes Design haben wollen.

Ich glaube nicht, dass das Fehlen von Mehrfachvererbung in Java (wie in C++) Einschränkungen in Ihrer Code/Anwendungsdesign/Problemdomänenzuordnung in Klassen setzen wird.

0

Eine einfache Antwort ist, dass alle Klassen in Java von java.lang.Object IIRC abgeleitet sind. Also würden Sie immer haben ein Diamant-Problem ... :-D

+0

Nicht wirklich. Eltern-> Kind-> Objekt. So erweitert Parent Child, Child erweitert Object, es wird nur im letzteren Fall nicht explizit geschrieben, wie es automatisch impliziert wird. –

+0

@Massa: Diamond-Problem tritt auf, wenn mehrere Implementierungen in mehreren Basisklassen (von denen die Child-Klasse abgeleitet ist) derselben Methode ausgeführt werden. Wenn wir keine Methoden überschreiben, die in der java.lang.Object-Klasse definiert sind, führt dies im Wesentlichen nicht zu Mehrdeutigkeits- und Rautenproblemen. –

+0

"Wenn wir keine Methoden überschreiben, die in java.lang.Object definiert sind" überschreibe ich toString, hashcode und equals viel häufiger als ich multiple Vererbung wünschen –

-1

Der Diamant Problem entsteht, wenn mehrere übergeordnete Klassen ihre eigenen Implementierungen von etwas definieren und das Kind Klasse dieser beiden hat mit der Mehrdeutigkeit beschäftigen welche Implementierung zu verwenden ist. Was ist, wenn alle Klassen in Java von Object abgeleitet sind, das ist eine einzelne Elternklasse. "Ein Elternteil, mehrere abgeleitete Klassen" ist nicht das Gleiche wie "Mehrere Elternteile, einzelne abgeleitete Klasse"

+0

Nein. "Diamond Problem" bezieht sich auf mehrere Basisklassen, die eine Basisklasse teilen, nicht Mitglieder mit demselben Namen. – curiousguy

2

Einfachheit. Zu zitieren Tom Sintes,

Das Java-Design-Team bemühte sich Java zu machen:

  • Einfach, objektorientiert, und vertraut
  • Robust und sicher
  • Architektur neutral und tragbare
  • Hochleistungs
  • Interpretiert, gewunden und dynamisch

Die Gründe für das Weglassen der Mehrfachvererbung aus der Java-Sprache stammen meist aus dem "einfachen, objektorientierten und vertrauten" Ziel. Als eine einfache Sprache, Java-Ersteller wollten eine Sprache, die die meisten Entwickler ohne umfangreiches Training erfassen konnten. Zu diesem Zweck arbeiteten sie , um die Sprache so ähnlich wie C++ zu machen (vertraut) , ohne C++ unnötige Komplexität (einfach) zu übertragen.

Nach Meinung der Designer verursacht mehrere Vererbung mehr Probleme und Verwirrung, als es löst. So schneiden sie mehrere Vererbung von die Sprache (so wie sie Operatorüberladung schneiden). Die umfangreiche C++ - Erfahrung der Designer lehrte sie, dass multiple Vererbung nur die Kopfschmerzen nicht wert war.

1

Java-Designer entschieden, dass. Die Mehrfachvererbung kann durch die Verwendung von Schnittstellen simuliert werden.

2

wenn Java-Unterstützung Mehrfachvererbung, dann kann es andere Funktionen von Java bewirken
betrachten super() Methode, die verwendet wird Superklasse constructor.if Programm aufrufen mehrere Superklasse hat (wegen der Mehrfachvererbung), dann wird Compiler verwirrt über welchen Superklassenkonstruktor sollte ein Fehler ausgegeben werden?

+0

korrigieren Sie mich, wenn ich falsch lag –

0

Es ist wahr, dass Java die mehrfache Vererbung der Implementierung nicht unterstützt (nur vom Typ, dh Schnittstelle). Das war eine Designentscheidung.

Seit Java 8 wird jedoch die Mehrfachvererbung mit Standardmethoden unterstützt. Siehe http://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html:

Mehrfachvererbung der Implementierung ist die Fähigkeit, Methodendefinitionen aus mehreren Klassen zu erben. Bei dieser Art der Mehrfachvererbung treten Probleme auf, z. B. Namenskonflikte und Mehrdeutigkeiten. ... Standardmethoden führen eine Form der Mehrfachvererbung von Implementierung ein.

+0

Namenskonflikt von der Vererbung von "Schnittstellen" (degenerierte Klassen) kann auch entstehen. – curiousguy