Alternative der Mehrfachvererbung in Java

8

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?

    
Rakesh Juyal 24.06.2009, 13:26
quelle

8 Antworten

9

Nur um meinen Kommentar zu klären.

  

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.

%Vor%     
willcodejavaforfood 24.06.2009, 15:01
quelle
11

benutze Schnittstellen:

%Vor%

Ersetzen Sie dann instanceof durch Standardmethodenaufrufe.

    
dfa 24.06.2009 13:27
quelle
8

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.

    
Robin 24.06.2009 13:45
quelle
1

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.

    
Jon 24.06.2009 15:20
quelle
1

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 .

    
someguy 21.11.2009 13:42
quelle
0

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.

    
Sean 24.06.2009 13:30
quelle
0

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.

    
andandandand 24.06.2009 13:30
quelle
0

Sie können BackPageAware und InformationAware als Schnittstellen und nicht als Klassen verwenden. Dadurch können Sie dann die Nachrichten von beiden Schnittstellen abrufen, wenn die 'Bean', auf die Sie sich beziehen, von BackPageAware und InformationAware ist.

%Vor%     
JP24 30.07.2013 02:11
quelle

Tags und Links