Ich habe zwei Bohnen erstellt
%Vor%Nun, wenn eine Klasse Backpage-bewusst ist, dann wird BackPageBean erweitert, oder wenn sie eine Art von Nachricht anzeigen muss, dann erweitert sie InformationMessageBean.
%Vor%Jetzt ist das Problem, wenn ich eine Bohne haben möchte, die sowohl BackPageAware als auch InformationAware ist, dann, wie wir nicht mehrfache Vererbung haben, was sollte der Ansatz sein?
Nur um meinen Kommentar zu klären.
%Vor%Genau wie Darth Eru sagt, du schaffst es die beiden Schnittstellen und die beiden Standard Implementierungen. Wenn du eine Bohne hast das braucht beide Verhaltensweisen Lassen Sie diese Klasse die beiden implementieren Schnittstellen erstellen Sie aber auch Variablen des Standards Implementierungen. So bleibst du immer noch Du musst keinen Code duplizieren.
Das Problem, das Sie beschreiben, erfordert die Verwendung von Komposition, nicht Vererbung. Die Klasse BackPageAware bedeutet, dass sie diese Klasse / Funktionalität kennt. Vererbung bedeutet, dass IS eine BackPage ist. Sie haben eine Beziehung HAS A beschrieben.
Wie bereits oft erwähnt, verwenden Sie Schnittstellen, um die Verträge zum Abrufen der Informationen zu definieren, die das Objekt HAS hat.
Ihre beiden ursprünglichen Klassen sollten Schnittstellen sein, die jeweils eine Methode enthalten, die die Informationen abruft, die die Implementierungen zurückgeben sollen.
%Vor%Wenn Sie möchten, dass eine Klasse sowohl BackPageBean als auch InformationMessageBean implementiert, tun Sie dies einfach:
%Vor%Im Allgemeinen sollten Sie vermeiden, nicht-abstrakte Klassen zu erweitern, wann immer Sie können, es führt zu allen möglichen Problemen. Versuchen Sie stattdessen, anstelle der Vererbung die Komposition zu verwenden, an der konkrete Klassen beteiligt sind. Versuchen Sie andernfalls, sich an Schnittstellen und die gelegentliche Klasse Abstracts zu halten.
Wie in anderen Antworten besprochen, kann die Mehrfachvererbung unter Verwendung von Schnittstellen und Komposition simuliert werden, wobei viel Code geschrieben werden muss. Es gibt jedoch eine Reihe von Projekten, die dies entweder zur Kompilierungszeit (über einen Preprozessor) oder zur Laufzeit zB jmixin
Deklarieren Sie BackPageAware und InformationAware als Schnittstellen, erstellen Sie abstrakte Klassen, die diese Schnittstellen implementieren, um die Standardfunktionalität bereitzustellen. Jede Klasse, die nur eine der beiden Schnittstellen sein muss, kann die entsprechende abstrakte Klasse erben. Eine Klasse, die beides sein muss, kann eine der abstrakten Klassen erben und die andere Schnittstelle implementieren oder beide Schnittstellen implementieren, was auch immer. Wenn es keine Standardfunktionalität gibt, brauchen Sie nicht einmal die abstrakten Klassen.
Sie können nicht mehrere Klassen erweitern, aber Sie können mehrere Schnittstellen implementieren. Denken Sie daran, dass das Objekt der Klasse eine IS-A-Beziehung mit der Schnittstelle aufweist, wenn Sie eine Schnittstelle auf eine Klasse anwenden.
Tags und Links java multiple-inheritance