wake-up-neo.net

Klasse, die mehr als eine Klasse Java erweitert?

Ich weiß, dass eine Klasse mehr als eine Schnittstelle implementieren kann. Ist es jedoch möglich, mehr als eine Klasse zu erweitern? Zum Beispiel möchte ich, dass meine Klasse sowohl TransformGroup als auch eine von mir erstellte Klasse erweitert. Ist das in Java möglich? Beide Anweisungen class X extends TransformGroup extends Y und class X extends TransformGroup, Y erhalten einen Fehler. Und wenn es nicht möglich ist, warum? TransformGroup erweitert Group, aber ich denke, es erweitert auch Node, da es Felder von Node erbt und übergeben werden kann, wenn ein Node-Objekt erforderlich ist. Wie alle Klassen in Java erweitern sie auch die Klasse Object. Warum sollte es nicht möglich sein, mit mehr als einer Klasse zu erweitern? 

Vererbung von TransformGroup

Wenn dies möglich ist, wie können Sie dies tun? Und wenn nicht, warum und wie sollte ich das Problem lösen?

20
Bujanca Mihai

In Java ist die Mehrfachvererbung nicht zulässig. Es wurde als Designentscheidung aus der Sprache ausgeschlossen, hauptsächlich um zirkuläre Abhängigkeiten zu vermeiden.

Szenario1: Wie Sie gelernt haben, ist Folgendes in Java nicht möglich:

public class Dog extends Animal, Canine{

}

Szenario 2: Folgendes ist jedoch möglich:

public class Canine extends Animal{

}

public class Dog extends Canine{

}

Der Unterschied zwischen diesen beiden Ansätzen besteht darin, dass es im zweiten Ansatz eine klar definierte übergeordnete oder super-Klasse gibt, während im ersten Ansatz die super-Klasse mehrdeutig ist. 

Bedenken Sie, ob sowohl Animal als auch Canine eine Methode drink() hatten. Welche Muttermethode würde im ersten Szenario aufgerufen, wenn wir Dog.drink() aufrufen? Im zweiten Szenario wissen wir, dass der Aufruf von Dog.drink() die Methode Canine classes drink aufruft, solange Dog sie nicht überschrieben hat.

50
Kevin Bowersox

In Java ist die Mehrfachvererbung für Implementierungen (Klassen) nur für Schnittstellen nicht zulässig:

interface A extends B, C

Z.B. MouseInputListener erweitert MouseListener und MouseMotionListener

Und natürlich kann eine Klasse mehrere Schnittstellen implementieren:

class X implements A, F
4
Puce

Nein, das ist in Java nicht möglich (vielleicht ist es in Java 8 verfügbar). Akzeptieren Sie den Fall, wenn Sie in einem Baum erweitern. Zum Beispiel:

class A
class B extends A
class C extends B
4
András Tóth

In Java gibt es kein Konzept der Mehrfachvererbung. Es können nur mehrere Schnittstellen implementiert werden.

3
Aashray

Mehrfachvererbung http://bit.ly/1Z62XjI

Angenommen, B und C überschreiben die vererbte Methode und ihre eigene Implementierung. Jetzt erbt D beide B & C durch Mehrfachvererbung. D sollte die überschriebene Methode erben. Die Frage ist, welche überschriebene Methode verwendet wird. Wird es von B oder C sein? Hier haben wir eine Zweideutigkeit. Um diese Situation auszuschließen, wurde in Java keine Mehrfachvererbung verwendet.

3
amitguptageek

Mehrfachvererbung ist mit class nicht möglich, Sie können dies mit Hilfe der Schnittstelle erreichen, nicht jedoch mit class. Es ist von Entwurf der Java-Sprache. Sieh dir einen Kommentar von James Gosling an.

von James Gosling im Februar 1995 gibt eine Vorstellung davon, warum multiple Vererbung wird in Java nicht unterstützt.

Java lässt viele selten genutzte, schlecht verstandene und verwirrende Funktionen von .__ aus. C++, das nach unserer Erfahrung mehr Kummer bringt als Nutzen. Diese besteht hauptsächlich aus der Überladung von Operatoren (obwohl es eine Methodenüberladung hat), mehrfacher Vererbung und umfangreicher automatischer Zwang.

3
Rais Alam

Java hat keine Mehrfachvererbung bereitgestellt.
Wenn Sie sagen, dass A B erweitert, bedeutet dies, dass A B erweitert und B Objekt erweitert.
Es bedeutet nicht, dass A B, Objekt erweitert.

class A extends Object
class B extends A

2
The Reader

Java kann Mehrfachvererbung nicht unterstützen. Dies kann jedoch auf diese Weise geschehen

class X
{
}
class Y extends X
{
}
class Z extends Y{
}
2
Biswajit

Die meisten Antworten scheinen zu vermuten, dass alle Klassen, die wir erben wollen, von uns definiert werden.

Was aber, wenn eine der Klassen nicht von uns definiert wird, d. H. Wir können nicht ändern, von welcher Klasse diese Klasse erbt, und daher die akzeptierte Antwort nicht verwenden können. Was passiert dann?

Nun, die Antwort hängt davon ab, ob wir mindestens eine der Klassen von uns definiert haben. Das heißt, es gibt eine Klasse A in der Liste der Klassen, von denen wir erben möchten, wobei A von uns erstellt wird.

Neben der bereits akzeptierten Antwort schlage ich drei weitere Fälle dieses multiplen Vererbungsproblems und mögliche Lösungen für jedes Problem vor.

Vererbungstyp 1

Ok, Sie möchten, dass eine Klasse C die Klassen A und B erweitert, wobei B eine an anderer Stelle definierte Klasse ist, A jedoch von uns definiert wird. Was wir damit machen können, ist, A in ein Interface zu verwandeln. Die Klasse C kann A implementieren und dabei B erweitern.

class A {}
class B {} // Some external class
class C {}

Verwandelt sich in

interface A {}
class AImpl implements A {}
class B {} // Some external class
class C extends B implements A

Vererbungstyp 2

Nehmen wir an, Sie haben mehr als zwei Klassen, von denen Sie erben können. Nun, die gleiche Idee gilt immer noch - alle bis auf eine der Klassen müssen von uns definiert werden. Angenommen, wir wollen, dass die Klasse A von den folgenden Klassen erbt: B, C, ... X, wobei X eine Klasse ist, die außerhalb von uns liegt, d. H. An anderer Stelle definiert ist. Wir wenden die gleiche Idee an, alle anderen Klassen, aber die letzte in eine Schnittstelle umzuwandeln, dann können wir:

interface B {}
class BImpl implements B {}
interface C {}
class CImpl implements C {}
...
class X {}
class A extends X implements B, C, ...

Vererbungsart 3

Schließlich gibt es auch den Fall, dass Sie nur eine Reihe von Klassen erben müssen, von denen jedoch keine definiert ist. Dies ist etwas kniffliger, aber es ist machbar, indem man delegation verwendet. Durch die Delegierung kann eine Klasse A so tun, als sei sie eine andere Klasse B, aber alle Aufrufe von A an eine in B definierte öffentliche Methode delegieren diesen Aufruf tatsächlich an ein Objekt vom Typ B, und das Ergebnis wird zurückgegeben. Dies macht Klasse A zu dem, was ich einen Fat class nennen würde.

Wie hilft das?

Nun, es ist ganz einfach. Sie erstellen eine Schnittstelle, die die öffentlichen Methoden innerhalb der externen Klassen angibt, die Sie verwenden möchten, sowie Methoden innerhalb der neuen Klasse, die Sie erstellen, und dann müssen Sie die neue Klasse für diese Schnittstelle implementieren. Das mag verwirrend geklungen haben, lassen Sie mich das besser erklären.

Anfangs haben wir die folgenden externen Klassen B, C, D, ..., X, und wir möchten, dass unsere neue Klasse A von all diesen Klassen erbt.

class B {
    public void foo() {}
}

class C {
    public void bar() {}
}

class D {
    public void fooFoo() {}
}

...

class X {
    public String fooBar() {}
}

Als Nächstes erstellen wir eine Schnittstelle A, die die öffentlichen Methoden, die zuvor in Klasse A waren, sowie die öffentlichen Methoden der obigen Klassen verfügbar macht

interface A {
    void doSomething(); // previously defined in A
    String fooBar(); // from class X
    void fooFoo(); // from class D
    void bar(); // from class C
    void foo(); // from class B
}

Schließlich erstellen wir eine Klasse AImpl, die das Interface A implementiert.

class AImpl implements A {
    // It needs instances of the other classes, so those should be
    // part of the constructor
    public AImpl(B b, C c, D d, X x) {}
    ... // define the methods within the interface
}

Und da hast du es! Dies ist eine Art Pseudo-Vererbung, da ein Objekt vom Typ A keine strenge Nachkommenschaft der externen Klassen ist, mit denen wir begonnen haben, sondern ein Interface verfügbar macht, das dieselben Methoden wie in diesen Klassen definiert.

Sie fragen sich vielleicht, warum wir nicht einfach eine Klasse erstellt haben, die die Methoden definiert, die wir verwenden möchten, anstatt ein Interface zu definieren. d. h. Warum hatten wir nicht einfach eine Klasse A, die die öffentlichen Methoden der Klassen enthält, von denen wir gerne erben möchten? Dies wird gemacht, um Kopplung zu reduzieren. Wir möchten keine Klassen haben, die A verwenden, um zu sehr von der Klasse A abhängig zu sein (weil Klassen dazu neigen, sich sehr zu ändern), sondern auf das Versprechen der Schnittstelle A angewiesen sind.

1
smac89

Java erlaubt keine Erweiterung mehrerer Klassen.

Nehmen wir an, die Klasse C erweitert die Klassen A und B. Wenn angenommen, A und B Klassen haben eine Methode mit demselben Namen (Ex: Methode1 ()). Betrachten Sie den Code: 

C obj1 = new C();obj1.method1(); - hier wird die JVM nicht verstehen, auf welche Methode sie zugreifen muss. Weil sowohl A- als auch B-Klassen diese Methode haben. Wir setzen also JVM in ein Dilemma, weshalb die Mehrfachvererbung von Java entfernt wird. Und wie gesagt, das Implementieren mehrerer Klassen löst dieses Problem.

Hoffe das hat geholfen.

0
Srekk