Design Pattern zur Realisierung von Mehrfachvererbung?

Status
Nicht offen für weitere Antworten.

-frank

Bekanntes Mitglied
Ich hab eine abstrakte Klasse AbstractA. Davon abgeleitet sind 6 Klassen A1 bis A6 (namen natürlich nur als Beispiel).
Nun nutze ich diese 6 Klassen in einem anderen Teil des Programms und benötige dafür Erweiterungen -->
B1..B6 extends A1..A6

da es in vielen Fällen es nicht wichtig ist, ob B1 oder B6 ist (sondern einfach nur ein B sein muss), kann man sich schon denken, dass es hier sehr viel gemeinsamkeiten gibt, die ich am liebsten in einer Klasse AbstractB zusammenfassen würde. Dass Mehrfachvererbung nicht möglich ist in Java vieles verkomplizieren würde, ist mir klar. Ich frage mich nun aber, wie man das ganze trotzdem (am besten) lösen kann. Gibt es dafür ein spezielles Design Pattern?

meine ansatz wäre gewesen, dass ich ein Interface B mache. dieses definiert den Kopf aller gemeinsam Methoden der B-Klassen. soweit so gut. Das löst die Verwendung von B-Objekten perfekt, aber nicht deren Implementierung:
das Problem ist nun, dass ich sehr viel gemeinsamen Code habe, sprich gerne ganze Methoden hinzufügen würde. Dazu würde ich nun eine Klasse BHelper machen, welche statische Methoden zur Verfügung stellt, um auf B-Objekten zu operieren.
in den B-Klassen habe ich dann zb eine vom B-Interface vorgegebene Methode
Code:
boolean doSomething(Object obj)
und diese wird zu
Code:
boolean doSomething(object obj) {
    return BHelper.doSomething(this, obj);
}

diese Methode muss dann natürlich in jede B-Klasse, aber immerhin ist der eigentliche Code in BHelper und somit nicht redundant.

meine zweite, recht ähnliche überlegung: die Vererbung von A auf B sieht so aus, dass B A erweitert in dem es weitere Felder hinzufügt und weitere Methoden. Ich könnte die Vererbung auch streichen (was eine abstrakte Klasse AbstractB ermöglichen würde) und dafür jedem B1..B6 Objekte ein A1..A6 (im Konstruktor) übergeben. dann müsste ich jede Methode von A in B implementieren, in dem ich sie an das A-Objekt weiterleite.

Code:
int doSomethingElse(Object obj) {
    return this.a.doSomethingElse(obj)
}

gibt es eine dritte möglichkeit?

worauf basierend sollte ich die entscheidung zwischen Variante 1 und 2 treffen?
vermutlich würde bei mir Variante 2 die B Objekte sehr verkomplizieren, andererseits hätte ich kein Hilfsobjekt B-Helper, welches für das funktionieren von B notwendig ist...
 

norman

Top Contributor
-frank hat gesagt.:
meine zweite, recht ähnliche überlegung: die Vererbung von A auf B sieht so aus, dass B A erweitert in dem es weitere Felder hinzufügt und weitere Methoden. Ich könnte die Vererbung auch streichen (was eine abstrakte Klasse AbstractB ermöglichen würde) und dafür jedem B1..B6 Objekte ein A1..A6 (im Konstruktor) übergeben. dann müsste ich jede Methode von A in B implementieren, in dem ich sie an das A-Objekt weiterleite.

Code:
int doSomethingElse(Object obj) {
    return this.a.doSomethingElse(obj)
}

Fast. Leite deine abstrakte B-Klasse von A ab. du musst aber nicht alle abstrakten methoden von A in B überschreiben, weil B ja auch abstrakt ist. das musst du erst in der konkreten implementierung machen. nur, was für alle Bs gleich ist, implementierst du auch in B.

Code:
public abstract class A {
	public abstract void doSth();
}

public abstract class B extends A {
	protected abstract void doSthElse();
}

public class ImplOfB extends B {

	@Override
	public void doSth() {
		
	}

	@Override
	protected void doSthElse() {
		
	}
}
 

-frank

Bekanntes Mitglied
norman hat gesagt.:
Fast. Leite deine abstrakte B-Klasse von A ab. du musst aber nicht alle abstrakten methoden von A in B überschreiben, weil B ja auch abstrakt ist. das musst du erst in der konkreten implementierung machen. nur, was für alle Bs gleich ist, implementierst du auch in B.

hmmm. ja, ich überleg(t)e, ob diese verebung für mich sinn macht. der vorteil wäre natürlich, dass automatisch jede eigenschaft von A auch von B und damit B1..B6 erfüllt wird. Allerdings kann ich die Methoden von A1..A1 so nicht vererben.
ich denke, es ist besser, wenn ich ein Interface A mache und dieses einfach von AbstractB nochmal implementieren lasse (anstatt direkt von AbstractA zu erben). zur implementierung der methoden nehme ich einfach ein A Objekt:
Code:
public doSomething() {
    getA().doSomething();
}

so habe ich zwar etliche solcher methoden, aber es sind ja immer nur 3-zeiler. der vorteil ist, dass ich mithilfe des A objekts dann auch die Methoden von A1..A6 mit 3-zeilern implementieren kann während ich diese methoden ohne ein solches objekt vollständig implementieren müsste:

Code:
public doSomethingElse() {
    ((A1)getA()).doSomethingElse();
}

diese kurzen methoden sind schnell geschrieben und kaum fehleranfällig. als großen nachteil sehe ich allerdings, dass eine methode aus A, die auf eine andere A-Methode zugreift, dann natürlich die Methode aus dem A-Objekt nimmt, während ich bei deiner Variante diese A Methode überschreiben könnte und dann die überschriebene Methode aufgerufen würde.

--> also vermutlich kommts da sehr stark auf die spezielle situation an und was man braucht.

danke auf jeden fall!
(falls du oder andere noch mehr nachteile bei meiner variante sehen, würde es mich freuen, wenn ihr sie mir mitteilt ;) )
 

norman

Top Contributor
-frank hat gesagt.:
Allerdings kann ich die Methoden von A1..A1 so nicht vererben.

sagt wer?

wenn B von A erbt, dann hat B1 alle methoden/ felder von B und genauso alle von A (sofern sie nicht schon von B überschrieben wurden).

natürlich nur wenn die methoden/felder protected oder mehr sind.
 

-frank

Bekanntes Mitglied
norman hat gesagt.:
wenn B von A erbt, dann hat B1 alle methoden/ felder von B und genauso alle von A (sofern sie nicht schon von B überschrieben wurden).

natürlich nur wenn die methoden/felder protected oder mehr sind.

das ist schon klar. aber - ich weiß nicht, ob es aus meinem erst post kalr genug hervorgeht - jedes B1 braucht alle Methoden von A1, jedes B2 alle von B2, etc. und diese methoden bekomme ich dann nicht.
 

norman

Top Contributor
okay, jetzt hab ichs auch ;) sorry..

dann erbt B1 von A1 und B2 von A2 usw usf und alle Bs implementieren ein Interface.
in den implementieren methoden in den Bs kannst du ja dann auch ein BHelper verweisen.

Code:
class B1 extends A1 implements BInterface {
  @override
  public void bInterface_doSth() {
    BHelper.doSth();
  }
}

was besseres weiß ich auch nicht :eek:/
 

-frank

Bekanntes Mitglied
norman hat gesagt.:
was besseres weiß ich auch nicht :eek:/

also ich hab noch ein bisschen rumgegooglet und es scheint auch nichts besseres zu geben. danke auf jeden fall!
ich habs jetzt allerdings umgekehrt gemacht, also B1 erbt von B und implementiert das Interface A1.
was ich so gelesen habe, sind beide varianten in ordnung. kommt dann halt auf die menge des codes an, welcher code sich öfter verändert, etc.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Meinung zum verwendeten Design Pattern Allgemeine Java-Themen 4
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
perlenfischer1984 Welches Design Pattern ist geegneit. Allgemeine Java-Themen 7
perlenfischer1984 Hilfe bei Design (Pattern) Allgemeine Java-Themen 5
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
F Welches Design Pattern? Allgemeine Java-Themen 3
D [Drag&Drop] Design-Pattern-Frage Allgemeine Java-Themen 4
ruutaiokwu welches design pattern? frage an die oo-experten unter euch... Allgemeine Java-Themen 3
G Accordion Design Pattern Frage Allgemeine Java-Themen 2
hdi Hilfe beim Design (Stichwort OO, Pattern, ...) Allgemeine Java-Themen 11
N Welches design pattern? Allgemeine Java-Themen 8
G Composite, Design Pattern, printTree Allgemeine Java-Themen 42
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
D Design Pattern: Singleton Allgemeine Java-Themen 4
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
S ArrayList Design Allgemeine Java-Themen 4
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
Kirby.exe Framework für Game Design Allgemeine Java-Themen 8
C WindowBuilder Design funktioniert nicht Allgemeine Java-Themen 0
M Diverse Design-Fragen Allgemeine Java-Themen 6
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
T OOP Fehler im Design Allgemeine Java-Themen 9
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
R Parameter Adapter - Design Allgemeine Java-Themen 1
D Bezüglich Design meines Codes Allgemeine Java-Themen 1
S Java Design Frage Allgemeine Java-Themen 10
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
M OOP Design Frage Allgemeine Java-Themen 2
J Domain Driven Design - Modellierungsfrage Allgemeine Java-Themen 3
H MVC Design Allgemeine Java-Themen 9
J Swing Eigenes Button-design Allgemeine Java-Themen 2
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
Z Design um boolsche ausdrücke zu speichern & auszuwerten Allgemeine Java-Themen 3
A Sinnvolles Software Design bei Eigenschaftsänderungen von Objekten Allgemeine Java-Themen 7
C Gutes Code Design (3 Schichten Modell) Allgemeine Java-Themen 19
D Design Stations-Gitter Allgemeine Java-Themen 4
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
G Design Patterns für Programm Allgemeine Java-Themen 3
I Wie populär ist Design by Contract in Java und was haltet ihr davon? Allgemeine Java-Themen 5
Landei Design-Problem Formel-Parser Allgemeine Java-Themen 10
J Aktionen im State-Design-Modell Allgemeine Java-Themen 3
S Design Oberfläche Allgemeine Java-Themen 2
L Design-Frage: Platzierung der Save-Methode Allgemeine Java-Themen 3
G Domain Driven Design Model Allgemeine Java-Themen 14
G konkretes Domain Driven Design Aggregate Allgemeine Java-Themen 2
B Design Problem Allgemeine Java-Themen 8
faulelotte Verständnisproblem Domain Driven Design Allgemeine Java-Themen 3
S Frage zum Design der Datenstruktur Allgemeine Java-Themen 10
D design gesucht - Angabe von zu ersetzenden substrings Allgemeine Java-Themen 2
D Design ohne Getter und Setter Allgemeine Java-Themen 8
D Design: on-the-fly-Parsing + Datenstrukturen Allgemeine Java-Themen 5
D design client server Allgemeine Java-Themen 10
T Design-Frage Allgemeine Java-Themen 14
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
S JToolBar Design Allgemeine Java-Themen 3
M Bildersyncronisierung - Design Patterns? Allgemeine Java-Themen 2
T Design - Exception in Thread Allgemeine Java-Themen 3
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
M Frage zum Design :: allgemein Allgemeine Java-Themen 6
U Frage zu DB Design Allgemeine Java-Themen 3
K Design / Implementierung Allgemeine Java-Themen 5
N Checkstyle - Design for Extension Allgemeine Java-Themen 4
E Was ist ein gutes Design fuer meine Programm? Allgemeine Java-Themen 3
F Paket und Software Design Fragen. Allgemeine Java-Themen 5
P Apple Design Allgemeine Java-Themen 5
S design frage Allgemeine Java-Themen 10
T Design-Tipp gesucht Allgemeine Java-Themen 2
M Design von Java Klassen Allgemeine Java-Themen 2
G java design von klassen und projekten Allgemeine Java-Themen 6
K Design: Klassen in Pakete aufteilen - Eure Meinung Allgemeine Java-Themen 8
S Programmierstil / design Allgemeine Java-Themen 9
S Exception design Allgemeine Java-Themen 2
m@nu Exception-Design Allgemeine Java-Themen 4
R Design-Frage Allgemeine Java-Themen 9
N Hilfe beim Design Allgemeine Java-Themen 13
Torres Design-Problem mit Jakarta Struts Allgemeine Java-Themen 2
A Anwendungs-Design (Plugin-Architektur) Allgemeine Java-Themen 4
mihe7 equals und instanceOf pattern matching Allgemeine Java-Themen 9
L Pattern Eventhandler Allgemeine Java-Themen 5
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Z MVC Pattern - sinnvolle Integration Allgemeine Java-Themen 6
Kirby.exe Filename nach bestimmtem Pattern durchsuchen Allgemeine Java-Themen 5
Meeresgott Best Practice "Spezifisches" Factory Pattern ? Allgemeine Java-Themen 1
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
M Vaadin MVP Pattern Allgemeine Java-Themen 1
N Java MVC Pattern richtig anwenden Allgemeine Java-Themen 24
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
B MVC-Pattern größeres Beispiel Allgemeine Java-Themen 16
GreenTeaYT Verstehe nicht ganz das Observer Pattern in einer Arrayliste? Allgemeine Java-Themen 3
L Erste Schritte Java Date Format Pattern bestimmten Allgemeine Java-Themen 2
D Pattern mit Pattern vergleichen Allgemeine Java-Themen 3
S Hilfe bei geeignetem Pattern (Decorierer) Allgemeine Java-Themen 2
J Pattern aus String entfernen Allgemeine Java-Themen 2
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
Rudolf State Pattern als Enum? Allgemeine Java-Themen 10
M massenhaft verschiedene Date-Pattern Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben