Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
VererbungAbstrakte Klasse mit Methode die Objekte der Subklassen benutzt?
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:
public abstract class Auto {
}
public class Audi extends Auto {
private PioneerRadio radio;
public void spieleMusik() {
// hier hast du Code der etwas mit dem Objekt radio macht;
}
}
public class VW extends Auto {
private BlaupunktRadio radio;
public void spieleMusik() {
// 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:
public abstract class Auto {
protected Radio radio;
public void spieleMusik() {
// hier hast du Code der etwas mit dem Objekt radio macht;
}
}
public class Audi extends Auto {
}
public class VW extends Auto {
}
Beispiel (so wie es dann sein könnte) Version 2:
Java:
public abstract class Auto {
public void spieleMusik(Radio radio) {
// hier hast du Code der etwas mit dem Objekt radio macht;
}
}
public class Audi extends Auto {
}
public class VW extends Auto {
}
VW car1 = new VW();
car1.spieleMusik(new BlaupunktRadio());
Audio car2 = new Audi();
car2.spieleMusik(new BlaupunktRadio());
Wenn du uns etwas Code zeigst (ein kleines KSKB wäre richtig super) können wir die besser helfen.
abstract class Auto{
public boolean tuWas(){
if(this.baujahr > 1999) return true;
}
}
class VW extends Auto{
private int baujahr;
private boolean heckspoiler;
}
class Audi extends Auto{
private int baujahr;
private boolean clima;
}
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.
Java:
public abstract class Auto {
protected int baujahr
public boolean tuWas() {
if(this.baujahr > 1999) return true;
}
}
class VW extends Auto{
private boolean heckspoiler;
}
class Audi extends Auto{
private boolean clima;
}
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.
Java:
public abstract class Auto {
protected int baujahr
public boolean tuWas() {
if(this.baujahr > 1999) return true;
}
}
class VW extends Auto{
private boolean heckspoiler;
}
class Audi extends Auto{
private boolean clima;
public void pruefe() {
if(tuWas()) {
// mach etwas;
}
}
}
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.
Java:
public abstract class Auto {
protected int baujahr
public boolean tuWas() {
if(this.baujahr > 1999) return true;
}
}
class VW extends Auto{
private boolean heckspoiler;
public boolean tuWas() {
if(super.tuWas()) {
if(heckspoiler) {
System.out.println("Sportwagen");
}
return heckspoiler;
}
}
}
class Audi extends Auto{
private boolean clima;
public boolean tuWas() {
if(super.tuWas()) {
if(clima) {
System.out.println("Kühlwagen");
}
return clima;
}
}
}
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.