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
und diese wird zu
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.
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...
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)
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...