Wie kann ich das machen:
public class Main extends ListActivity , ControlMenu
Außerdem würde ich gerne wissen, dass dieser Ansatz in Ordnung ist, dass ich die Menüs in der Klasse ControlMenu erstellt habe und sie in den restlichen Aktivitäten erweitere.
Antworten:
Sie können nur eine einzelne Klasse erweitern. Und implementieren Sie Schnittstellen aus vielen Quellen.
Das Erweitern mehrerer Klassen ist nicht verfügbar. Die einzige Lösung, die ich mir vorstellen kann, besteht darin, keine der beiden Klassen zu erben, sondern stattdessen eine interne Variable jeder Klasse zu haben und mehr als Proxy zu fungieren, indem die Anforderungen an Ihr Objekt an das Objekt umgeleitet werden, zu dem sie gehen sollen.
Dies ist die beste Lösung, die ich mir ausgedacht habe. Sie können die Funktionalität von beiden Klassen erhalten und dennoch nur von einem Klassentyp sein.
Der Nachteil ist, dass Sie nicht mit einem Guss in die Form der internen Klasse passen können.
quelle
Warum nicht eine innere Klasse verwenden (Verschachtelung)
quelle
Fragment
. Meine Aktivität muss erweitert werdenFragment
, was bedeutet, dass ich unbedingt etwas brauchegetView()
, was nicht funktioniert, wenn es sich innerhalb der inneren Klasse befindet, und der Code dort ist der Ort, an dem ich Code verwenden mussListActivity
, sodass ich nicht zweimal erweitern oder eine innere Klasse erstellen kann in diesem Beispiel.Wie alle anderen gesagt haben. Nein, das kannst du nicht. Obwohl die Leute im Laufe der Jahre oft gesagt haben, dass Sie mehrere Schnittstellen verwenden sollten, haben sie sich nicht wirklich damit befasst, wie. Hoffentlich hilft das.
Angenommen, Sie haben
class Foo
undclass Bar
möchten beide versuchen, sich in eine zu erweiternclass FooBar
. Natürlich können Sie, wie Sie sagten, nicht Folgendes tun:Die Gründe dafür sind bereits teilweise bekannt. Schreiben Sie stattdessen
interfaces
für beideFoo
undBar
decken Sie alle öffentlichen Methoden ab. Z.BUnd jetzt machen
Foo
undBar
implementieren Sie die relativen Schnittstellen:Mit
class FooBar
können Sie jetzt beides implementierenFooInterface
undBarInterface
dabei einFoo
undBar
-Orth behalten und die Methoden direkt durchlaufen:Der Bonus für diese Methode ist, dass das
FooBar
Objekt in die Formen von beidenFooInterface
und passtBarInterface
. Das heißt, das ist vollkommen in Ordnung:Ich hoffe, dies verdeutlicht die Verwendung von Schnittstellen anstelle mehrerer Erweiterungen. Auch wenn ich ein paar Jahre zu spät bin.
quelle
Sie möchten Schnittstellen verwenden. Im Allgemeinen ist die Mehrfachvererbung aufgrund des Diamantproblems schlecht:
C ++ und andere haben einige Möglichkeiten, dies zu lösen, z
Java verwendet jedoch nur Schnittstellen.
Die Java-Trails bieten eine großartige Einführung in die Benutzeroberfläche: http://download.oracle.com/javase/tutorial/java/concepts/interface.html Sie sollten dies wahrscheinlich befolgen, bevor Sie sich mit den Nuancen in der Android-API befassen.
quelle
virtual class
. Dies bringt viele Warnungen und Vorbehalte mit sich, sowohl für den Compiler als auch für den Entwickler.super
in einer Methode auf, die erbt. Nun, Sie können, aber Sie müssen die aufzurufende Schnittstellenmethode angeben (und das Schlüsselwortdefault
in der Schnittstellenimplementierung verwenden) . Ein Beispiel ist:MyIFace.super.foo()
wobei MyIFace eine Schnittstelle ist. Wie Sie sehen, ist die auszuführende Schnittstellenmethode definiert und vermeidet das Diamond-Problem vollständig. Wenn SieMyClass1
und erweiternMyClass2
, haben beide Klassen einfoo()
, und rufen auf,super.foo()
dann wird der Compiler vom Diamond-Problem ausgelöst."bar"
oder"baz"
mit Methodentyp von zurückgebenvoid
. Wie auch immer, gute Erklärung xDJa, wie alle anderen geschrieben haben, können Sie in Java keine Mehrfachvererbung durchführen. Wenn Sie zwei Klassen haben, aus denen Sie Code verwenden möchten, unterteilen Sie normalerweise nur eine (z. B. Klasse
A
). Für den UnterrichtB
abstrahieren Sie die wichtigen Methoden zu einer SchnittstelleBInterface
(hässlicher Name, aber Sie bekommen die Idee) und sagen dannMain extends A implements BInterface
. Im Inneren können Sie ein Objekt der Klasse instanziierenB
und alle Methoden von implementieren,BInterface
indem Sie die entsprechenden Funktionen von aufrufenB
.Dies ändert die "is-a" -Beziehung in eine "has-a" -Beziehung, da Ihre
Main
jetzt eine istA
, aber eine hatB
. Abhängig von Ihrem Anwendungsfall können Sie diese Änderung sogar explizit vornehmen, indem Sie dieBInterface
aus IhrerA
Klasse entfernen und stattdessen eine Methode bereitstellen, um direkt auf Ihr B-Objekt zuzugreifen.quelle
Machen Sie eine Schnittstelle. Java hat keine Mehrfachvererbung.
http://csis.pace.edu/~bergin/patterns/multipleinheritance.html
quelle
Java unterstützt keine Mehrfachvererbung, Sie können jedoch versuchen, zwei oder mehr Schnittstellen zu implementieren.
quelle
Ja. Slandau ist richtig. Java erlaubt keine Erweiterung von mehreren Klassen.
Was Sie wollen, ist wahrscheinlich
public class Main extends ListActivity implements ControlMenu
. Ich vermute, Sie versuchen, eine Liste zu erstellen.Hoffentlich hilft das.
quelle
Wie bei einer anderen Alternative können Sie möglicherweise eine Schnittstelle mit einer Standardimplementierung einer Methode verwenden. Das hängt natürlich davon ab, was Sie tun möchten.
Sie können beispielsweise eine abstrakte Klasse und eine Schnittstelle erstellen:
Danach können Sie beide Klassen erweitern und implementieren und beide Methoden verwenden.
Hoffe das hilft dir ...
quelle
Das Erweitern von mehreren Klassen ist in Java nicht erlaubt. Um den tödlichen Diamanten des Todes zu verhindern !
quelle
es ist möglich
quelle
Parallaxor
undParallaxController
sind unbekannt, also nehme ich an, dass sie keine SDK-Klassen sind. Das funktioniert bei mir also nicht (und daher zeigt diese Antwort Fehler). Was ist ParallaxController? Ist das eine spezifische Abhängigkeit? Bitte erläutern SieDie Entwickler von Java entschieden, dass die Probleme der Mehrfachvererbung die Vorteile überwiegen, sodass sie die Mehrfachvererbung nicht beinhalteten. Sie können über eine der größten Fragen der Mehrfachvererbung (das doppelte Diamant - Problem) lesen Sie hier .
Die beiden ähnlichsten Konzepte sind die Schnittstellenimplementierung und das Einschließen von Objekten anderer Klassen als Mitglieder der aktuellen Klasse. Die Verwendung von Standardmethoden in Schnittstellen entspricht fast genau der Mehrfachvererbung. Es wird jedoch als schlechte Praxis angesehen, eine Schnittstelle nur mit Standardmethoden zu verwenden.
quelle
Sie können in Java keine Mehrfachvererbung durchführen. Erwägen Sie die Verwendung von Schnittstellen:
oder innere Klassen:
quelle