Vererben großer Interface-Methoden

Luk10

Top Contributor
Grüße,

Ich habe eine feste und relative große Vererbungs-Struktur in meinem Programm. Sie besteht zum einem aus einem großen "extends"-Baum, jedoch implementieren einige Klassen auch Interfaces.

Nun meine Frage:

Ein Interface wird von 3 Klassen mitten in der "extends"-Struktur implementiert. Dieses Interface lässt eine Methode implementieren, die bei allen 3 Klassen gleich aussieht. Zusätzlich ist diese Methode sehr große bzw. lang sie enthält ca. 150 Zeilen Code.

Es erscheint nicht besonders "schön" 3 mal die exakt gleiche Methode zu implementieren, jede ziemlich lang. Besonders unter dem Aspket Wiederverwendbarkeit und Wartbarkeit ist das ja ein Alptraum ...

Kann man das irgendwie besser lösen? Ist hier ein Adapter sinnvoll, und wenn ja wie kriege ich den vernünfitg implementiert?

Danke,
-Luk10-
 
wenn ich jetzt bei vererbung nicht völlig daneben liege sollte ein einfacher call von [c]methodenname(parameter...)[/c] möglich sein ... selbst ohne super und auch ohne in "zwischenebenen" diese methode mit einem super-call zu überschreiben ...

ergo

in der "höchsten" klasse die das interface implementiert wird der code EINMAL geschrieben ... danach kann man von allen abgeleiteten klassen diese einfach callen ...

*vergleich dazu wäre z.b. SWING : man kann auf die meisten components einfach add(component) callen obwohl diese schon sehr weit oben implementiert ist und in den ebenen dazwischen nicht durch super-calls überschrieben wird
 
Die Interfaces makieren aber bestimmten Objekte (bestimmter Klassen).

Ich überprüfe also
Code:
if(meineKlasse instanceof meinMarkerInterface) {

Wenn ich nun die "Überklasse" aller "Unterklassen" das Interface implementieren lasse, funktioniert das nichtmehr.

-Luk10-
 
Die Interfaces makieren aber bestimmten Objekte (bestimmter Klassen).

Ich überprüfe also
Code:
if(meineKlasse instanceof meinMarkerInterface) {

Wenn ich nun die "Überklasse" aller "Unterklassen" das Interface implementieren lasse, funktioniert das nichtmehr.

-Luk10-

Häh? Poste mal Code oder was ähnliches. Ich kann deinem Vererbungs und Implementierungs Konstrukt nicht mehr folgen :autsch:
 
öhm ... dann habe entweder ich gerade einen denkfehler *ja passiert mir auch mal ab und zu* ... oder es ist so wie ich jetzt denke *achtung : könnte auch falsch sein*

wenn du eine klasse hast die ein bestimmtes interface implementiert ... dann implementieren auch alle sub-klassen dieses interface ... darum ist auch [c]sub-klasse instanceof interface[/c] true wenn [c]super-klasse implements interface[/c] gilt ...

und zur not kannst du immer noch den würg-arround machen und mit [c]super[/c] an die super-klasse delegieren ... hat dann nur den nachteil das du das dann den gesamten vererbungs-baum durchziehen musst

[EDIT]@kappesf
geht mir genau so xD[/EDIT]
 
gemeinsame Basisklasse ist eine Variante,

ansonsten noch allgemein die Auslagerung von Code in Hilfsklassen bzw. in eine der drei 3 Klassen, wahrscheinlich statisch,
und in mindestens 2 Fällen in nur einer Zeile an die andere weiterreichen,
das eigene Objekt this als Parameter übergeben, falls benötigt,

benötigte private Attribute/ Methoden machen es kniffliger, bei immer gleichen Code aber vielleicht nicht der Fall
 
Zum Verstandniss:

> 5 Unterklassen erben von Superklasse
> 3 Unterklassen implementieren mein Interface (sollen Methode implementieren und makiert werden)
> Wenn ich die Superklasse anstatt der Unterklassen das Interface implementieren lasse sind alle Unterklassen
Code:
instanceof Interface
. Das will ich nicht.

> Ich muss entweder in allen 3 Unterklassen die Methode (aufwändig) implementieren
> oder einen anderen Weg finden

@SlaterB
Was meinst du mit "gemeinsamer" Basisklasse? Wenn ich 4 oder mehr Ebenen habe, ist das glaube ich nicht so einfach einzuführen.
Zweite Variante hört sich sinnvoll, aber nicht gerade "schön" an. Ich erzeuge eine statische Methode, und eine feste Bindung dreier Klassen aneinander, die eig. nichts von einander wissen müssen.

-Luk10-
 
> und eine feste Bindung dreier Klassen aneinander, die eig. nichts von einander wissen müssen.

es gibt keine Variante auf der Welt, in der 3 Klassen 150 Zeilen Code gemeinsam benutzen,
ohne irgendwie voneinander bzw. von einer bestimmten allgemeinen Klasse zu wissen..

edit: ok, mit gewissen Mitteln geht alles, dynamisch Objekte, die Code enthalten, hinzufügen,
etwa ein ActionListener an JButton, JMenu usw.

> Wenn ich die Superklasse anstatt der Unterklassen das Interface implementieren lasse sind alle Unterklassen instanceof Interface . Das will ich nicht.

wenn in der Oberklasse die Methode definiert wird, muss nicht auch das Interface implementiert werden,
die Methode kann einfach so da sein

vielleicht stört es, dass sie für die anderen beiden Subklassen dann auch noch verfügbar ist,
denkbar ist eine weitere Zwischenebene X, unter der bisherigen Oberklasse, die 3 Klassen erben davon
(X wäre dann die 'gemeinsame Basisklasse' der 3 Klassen, dass es noch mehr Ebenen nach oben gibt
stört nicht unbedingt, jede Klasse erbt eh mindestens von Object)
 
Zuletzt bearbeitet von einem Moderator:
@TO

dann mach es dir noch etwas einfacher ...

nach deiner beschreibung hast du "eine" super-klasse von der 5 GLEICHWERTIGE "sub-klassen" erben ... also alle auf einer ebene ... soweit korrekt ?

und 3 dieser 5 klassen sollen ein interface und eine methode implementieren welche exakt den selben inhalt hat ?

dann ist das ganze sehr einfach

auf deiner "ersten sub-ebene" nimmst du die 3 klassen die das interface implementieren RAUS und fügst dafür eine "zwischen" klasse ein die sowohl das interface als auch die methode implementiert ...

und von dieser zwischen-klasse lässt du nun die drei anderen erben ...


ansonsten musst du wirklich mal ein klassendiagramm erstellen und uns mal graphisch zeigen was du meinst ... weil nur mit worten schaffst du es ja scheinbar nicht dich klar auszudrücken
 
Ich würde auch diesen Weg Vorschlagen:

1)2 erben direkt von der Basisklasse
2)Das Interface wird zur Klasse welche von der Basisklasse erbt.
3)Die 3 Klassen welches das Interface implementierten erben von der neuen Klasse und haben dioe Methode somit als auch alles von der Basis-Basisklasse geerbt.
 
Jap.. Mehrfachvererbung gibt es nicht, das ist nur mitHilfe von interfaces in Java machbar.

Somit kannst du das Problem umgehen..


copy kappesf-> @aggree:

---------------------------------------------------
Ich würde auch diesen Weg Vorschlagen:

1)2 erben direkt von der Basisklasse
2)Das Interface wird zur Klasse welche von der Basisklasse erbt.
3)Die 3 Klassen welches das Interface implementierten erben von der neuen Klasse und haben dioe Methode somit als auch alles von der Basis-Basisklasse geerbt.
-----------------------------------------------------

Best regards,
x22
 
Danke für eure Hilfe!

Leider lässt sich nur bei einer Vererbungsstruktur eine gemeinsame Subebene erstellen. Funktioniert super und einfach, leider muss ich bei der anderen anders zurecht kommen. Ich hab jetzt die Lösung von SlaterB verwendet und es funktioniert soweit ganz gut.

Luk10
 
Bei 150 Zeilen könnte man auch in Erwägung ziehen, die Methode auszulagern (als public static utility methode) und in den Implementierungen dann nurnoch die zu verwenden, aber ... weiß halt nicht ob das hier passt...
 
Irgendwer hat mal gesagt, eine Methode soll nicht mehr als 7 Zeilen und zwei (oder einen?) Verschachtelungen besitzen (Schleifen etc.).
Meiner Meinung nach können es auch gerne Mal 10, 15 oder gar 20 Zeilen sein. Aber bei 150 solltest du dann über den Daumen geschätzt auch 10-20 Methoden haben. Aber warscheinlich wird es praktisch nicht so viel sein, weil du am Schluss sicherlich weniger Code haben wirst.
 

Neue Themen


Zurück
Oben