Ich habe eine abstracte super-Klasse und zwei subklassen dazu.
Jetzt habe ich das Problem das ich in den Subklassen eine Methode habe, die im Prinzip
identisch wären (weswegen ich sie gerne nur einmal in der Super-Klasse aufführen würde).
Allerdings bezieht sich die Methode in ihrem body mit this.irgendwas ja auf eine Objektvariable die ja erst durch die Subklassen Sinn ergibt.
Muss ich da die Struktur der ganzen Methode ändern oder gibt es da was, dass ich quasi der Superklasse sage: Hey nimm doch bitte das Objekt der Subklasse.
Deine beiden Subklassen verwenden also jeweils ein Objekt.
Das Objekt wird in einer Methode verwendet, welche in beiden Klassen identisch ist?
Somit könnte man auch für diese Klassen dieser beiden Objekte eine abstrakte Basisklasse festlegen (oder wenigstens beide Klassen das gleiche Interface implementieren und in der Methode gegen das Interface programmieren).
Wenn dann beide Objekte eine gemeinsame Basisklasse oder ein gemeinsames Interfaces haben kannst du diese Objekte an die Methode übergeben (oder in der Basisklasse speichern und per this in der Methode darauf zugreifen)
Ich glaube die Basisklasse und Basisklasse von den 2 verwendeten Objekten hat mehr verwirrt als das es geholfen hat.
Beispiel (so habe ich deinen Aufbau verstanden):
Java:
publicabstractclassAuto{}publicclassAudiextendsAuto{privatePioneerRadio radio;publicvoidspieleMusik(){// hier hast du Code der etwas mit dem Objekt radio macht;}}publicclass VW extendsAuto{privateBlaupunktRadio radio;publicvoidspieleMusik(){// hier hast du Code der etwas mit dem Objekt radio macht;}}
Du meintest du hast 2 Methode, welche identisch sind (hier spieleMusik). Daher würdest du die Methode gerne in der Superklasse deklarieren um den Code nicht 2x zu haben.
Wenn du nun aber die beiden Klassen BlaupunktRadio und PioneerRadio hernimmst.
Beide werden in der Methode spieleMusik verwendet und laut deiner Aussage sind die Methoden identisch. Daher haben die Klassen anscheinend auch die selben Attribute/Methoden.
Erstelle daher eine Basisklasse Radio für und leite BlaupunktRadio und PioneerRadio davon ab.
Schon kannst du die Methode spieleMusik in die abstrakte Basisklasse Auto schieben und übergibst entweder ein Objekt der Klasse Radio oder speicherst das Objekt der Klasse Radio direkt in der Basisklasse und nicht jeweils in den Subklassen ab
Beispiel (so wie es dann sein könnte) Version 1:
Java:
publicabstractclassAuto{protectedRadio radio;publicvoidspieleMusik(){// hier hast du Code der etwas mit dem Objekt radio macht;}}publicclassAudiextendsAuto{}publicclass VW extendsAuto{}
Beispiel (so wie es dann sein könnte) Version 2:
Java:
publicabstractclassAuto{publicvoidspieleMusik(Radio radio){// hier hast du Code der etwas mit dem Objekt radio macht;}}publicclassAudiextendsAuto{}publicclass VW extendsAuto{}VW car1 =newVW();
car1.spieleMusik(newBlaupunktRadio());Audio car2 =newAudi();
car2.spieleMusik(newBlaupunktRadio());
Wenn du uns etwas Code zeigst (ein kleines KSKB wäre richtig super) können wir die besser helfen.
Also die Objektvariablen die die Methode nutzt sind gleich, es gibt aber noch mehr als nur diese Variablen.
Ich könnte natürlich jetzt alternativ einfach das komplette Objekt immer an die Auto Methode übergeben (also entweder vw oder audi) und dann davon diese Vars ziehen, aber ich dachte es ginge irgendwie ohne das Objekt so als Parameter zu übergeben.
Abstrakte Klassen kann man ja nicht instanziieren oder? (macht ja auch wenig Sinn eigentlich).
Diese Basisklasse ist halt abstrakt und soll nicht instanziiert werden, ich möchte aber halt in deren Subklassen mit den instanziierten Objekten der Subklassen auf die Methode die einmal in der Basisklasse steht zugreifen.
Puh, echt nicht so einfach das deutlich auszudrücken. Hoffe ist mir jetzt besser gelungen!
Also die Objektvariablen die die Methode nutzt sind gleich, es gibt aber noch mehr als nur diese Variablen.
Ich könnte natürlich jetzt alternativ einfach das komplette Objekt immer an die Auto Methode übergeben (also entweder vw oder audi) und dann davon diese Vars ziehen, aber ich dachte es ginge irgendwie ohne das Objekt so als Parameter zu übergeben.
Abstrakte Klassen kann man ja nicht instanziieren oder? (macht ja auch wenig Sinn eigentlich).
Diese Basisklasse ist halt abstrakt und soll nicht instanziiert werden, ich möchte aber halt in deren Subklassen mit den instanziierten Objekten der Subklassen auf die Methode die einmal in der Basisklasse steht zugreifen.
Puh, echt nicht so einfach das deutlich auszudrücken. Hoffe ist mir jetzt besser gelungen!
Ah ich versteh.
Dein 1.Fehler liegt schon mal darin das VW und Audi jeweils ein Attribut "baujahr" haben. Diese sollte eigentlich in der Basisklasse liegen und nicht in der Subklasse.
Eine abstrakte Basisklasse sollte Gemeinsamkeiten vereinen, das "baujahr" wäre so eine.
Der 2.Fehler liegt darin "Diese Basisklasse ist halt abstrakt und soll nicht instanziiert werden, ich möchte aber halt in deren Subklassen mit den instanziierten Objekten der Subklassen auf die Methode die einmal in der Basisklasse steht zugreifen."
Die Klasse VW ist eine Erweiterung von Auto. Eine VW ist daher ein Auto.
Sprich du kannst in der Klasse VW ganz einfach auf die Methode "tuWas" zugreifen.
Vielleicht wäre folgendes eine Lösung für dein Problem:
Implementiere für die Gemeinsamkeiten die Methode in der abstrakten Basisklasse. In der Subklassen implementierst du die Methode für die jeweiligen speziellen Attribute und rufst ganz am Anfang die Methode der Superklasse auf.
Variante 1 ja!
Variante 2 erzeugt unnötigen Code, soweit ich verstanden habe werden auf die speziellen Eigenschaften verwendet in der Methode. Sprich er müsste auch dafür abstrakte getter schreiben. Diese müssen wiederrum von alle Subklassen implementiert werden auch wenn es diese Attribut gar nicht gibt.