Vererbung Abstrakte Klasse mit Methode die Objekte der Subklassen benutzt?

alloisxp

Mitglied
Hallo allerseits!

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.

Viele Grüße
- alloisxp
 

Joose

Top Contributor
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)
 
Zuletzt bearbeitet:

alloisxp

Mitglied
Ah ok, also einfach das komplette Objekt übergeben, so wie:

methodeInBasisklasse(Basisklasse obj){ //kann Subklasse obj kriegen

obj.tuWas();
...
}

Da die Basisklasse ja abstrakt ist, will ich sie ja nicht instanziieren.

Aber so ein Sprachkonstrukt ala: (nimmObjektDerSubklasseAusDerMethodeGecalltWird).zugriff();

gibt es dann definitiv nicht ja?
 

jgh

Top Contributor
evtl. meinst du sowas in der Art:
Java:
public abstract class BasisKlasse {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new SubKlasse1();
		new SubKlasse2();

	}

	public void deineMethode(BasisKlasse b) {
		if (b instanceof SubKlasse1) {
			System.out.println("Subklasse1 ");
		}
		if (b instanceof SubKlasse2) {
			System.out.println("Subklasse2 ");
		}
	}
}

class SubKlasse1 extends BasisKlasse {
	public SubKlasse1() {
		deineMethode(this);
	}
}

class SubKlasse2 extends BasisKlasse {
	public SubKlasse2() {
		deineMethode(this);
	}
}
 
Zuletzt bearbeitet:

Joose

Top Contributor
Aber so ein Sprachkonstrukt ala: (nimmObjektDerSubklasseAusDerMethodeGecalltWird).zugriff();

gibt es dann definitiv nicht ja?

Nein gibt es nicht.

Da die Basisklasse ja abstrakt ist, will ich sie ja nicht instanziieren.

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.
 

alloisxp

Mitglied
Ok, also ich meine es schon so oder so ähnlich:

Java:
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!

Danke schonmal für die Antworten!
 
Zuletzt bearbeitet:

tommysenf

Top Contributor
Ich sehe hier 2 Möglichkeiten:

Variante 1 - Du ziehst die benötigten Eigenschaften gleich in die Basisklasse hoch

Java:
abstract class Auto{
    protected int baujahr;

    public boolean tuWas(){
       if(this.baujahr > 1999) return true;
    }
}

Variante 2: Du definierst abstrakte getter für die benötigten Eigenschaften, welche von den Basisklassen bereit gestellt erden müssen

Java:
abstract class Auto{
    
    protected abstract int getBaujahr();

    public boolean tuWas(){
       if(getBaujahr() > 1999) return true;
    }
}

class VW extends Auto{
      private int baujahr;
      private boolean heckspoiler;

      @Overrides
      protected abstract int getBaujahr() {
          return baujahr;
      }
}
 

Joose

Top Contributor
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!

Danke schonmal für die Antworten!

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;
        }
    }
}


Ich sehe hier 2 Möglichkeiten:
Variante 1 - Du ziehst die benötigten Eigenschaften gleich in die Basisklasse hoch

Variante 2: Du definierst abstrakte getter für die benötigten Eigenschaften, welche von den Basisklassen bereit gestellt erden müssen

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.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
J abstrakte Methode in Klasse mit Rückgabetyp der abgeleiteten Klasse Java Basics - Anfänger-Themen 5
StupidAttack Abstrakte Methoden in nicht-abstrakter Methode in abstrakter Klasse Java Basics - Anfänger-Themen 6
S Abstrakte Klasse, festlegen, dass Methode verändert werden muss. Java Basics - Anfänger-Themen 4
J abstrakte klasse und methode super Java Basics - Anfänger-Themen 2
G Abstrakte Methode in gleicher Klasse aufrufen Java Basics - Anfänger-Themen 5
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
T Abstrakte Klasse und Interfaces Java Basics - Anfänger-Themen 12
D Abstrakte Klasse, Konstruktorkette, Attribute setzen Java Basics - Anfänger-Themen 12
I Abstrakte Klasse - static Attribute deklarieren Java Basics - Anfänger-Themen 14
T Übungsaufgabe abstrakte Klasse Java Basics - Anfänger-Themen 21
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
K Abstrakte Klasse: vererbte Klasse; instance of? Java Basics - Anfänger-Themen 26
N Vererbung Abstrakte Klasse stateful Java Basics - Anfänger-Themen 3
W Abstrakte Klasse mit Variable? Java Basics - Anfänger-Themen 2
W Abstrakte und konkrete Klasse Java Basics - Anfänger-Themen 4
F Abstrakte Klasse doch zum "Teil" instanzieren? Java Basics - Anfänger-Themen 4
M Statische Methoden in Interface/Abstrakte Klasse Java Basics - Anfänger-Themen 6
N Datentypen abstrakte Klasse wird instanziert Java Basics - Anfänger-Themen 3
propra Interface - abstrakte Klasse Java Basics - Anfänger-Themen 18
N Abstrakte Klasse Java Basics - Anfänger-Themen 28
L Über abstrakte Klasse auf eine Klasse zugreifen? Java Basics - Anfänger-Themen 6
D Wann genau abstrakte Klasse und wann ein Interface verwenden? Java Basics - Anfänger-Themen 4
T Abstrakte Klasse Java Basics - Anfänger-Themen 3
S Abstrakte Klasse Java Basics - Anfänger-Themen 5
K Abstrakte Klasse vs. Interface Java Basics - Anfänger-Themen 21
K Abstrakte Klasse bilden? Java Basics - Anfänger-Themen 11
H Warum Java? | Abstrakte Klasse = Modul? Java Basics - Anfänger-Themen 20
H Eine Abstrakte Klasse muss. Java Basics - Anfänger-Themen 7
G Abstrakte Klasse "Point" Java Basics - Anfänger-Themen 2
M abstrakte Klasse Java Basics - Anfänger-Themen 3
F Abstrakte Klasse: Konstruktor vs init() Java Basics - Anfänger-Themen 13
G Abstrakte Klasse (was passiert hier) Java Basics - Anfänger-Themen 3
G Interface oder Abstrakte Klasse? Java Basics - Anfänger-Themen 3
Acha Unterschied Interface - abstrakte Klasse Java Basics - Anfänger-Themen 4
B OOP: abstrakte klasse implementiert interface Java Basics - Anfänger-Themen 3
D Abstrakte Klasse Graphics Java Basics - Anfänger-Themen 3
A Abstrakte Klasse Java Basics - Anfänger-Themen 3
G abstrakte klasse Java Basics - Anfänger-Themen 6
F Abstrakte Klasse Baum Java Basics - Anfänger-Themen 6
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
S Vererbung Abstrakte Methoden: Wozu das Ganze?! Java Basics - Anfänger-Themen 7
S abstrakte methoden in subclass? Java Basics - Anfänger-Themen 7
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
G Java Abstrakte Methoden Java Basics - Anfänger-Themen 2
L Abstrakte Typen und Schnittstellen Java Basics - Anfänger-Themen 19
S Abstrakte Methode nutzen Java Basics - Anfänger-Themen 9
J Objekte und Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Datentypen Abstrakte Datentypen Java Basics - Anfänger-Themen 0
A Abstrakte Datentypen - Methode delete Java Basics - Anfänger-Themen 6
D Abstrakte Klassen Verständniss Frage Java Basics - Anfänger-Themen 4
D Methoden Abstrakte Methoden Java Basics - Anfänger-Themen 3
D Interface Interfaces und abstrakte Klassen implementieren Java Basics - Anfänger-Themen 4
B Abstrakte Klassen Java Basics - Anfänger-Themen 7
C Abstrakte und virtuelle Methoden in Java Java Basics - Anfänger-Themen 4
E verdeckte abstrakte Methode sinnvoll? Java Basics - Anfänger-Themen 7
S Abstrakte Klassen Java Basics - Anfänger-Themen 2
C Dynamische Referenz & abstrakte Klassen Java Basics - Anfänger-Themen 3
V Interface Interfaces und abstrakte Klassen Java Basics - Anfänger-Themen 3
H Abstrakte Basisklasse Verständnisproblem! Java Basics - Anfänger-Themen 8
G Abstrakte Klassen - theoretische Frage Java Basics - Anfänger-Themen 2
OnDemand Abstrakte Klassen Java Basics - Anfänger-Themen 4
T OOP Abstrakte Klassen und ihre Kinder: wie läuft das? Java Basics - Anfänger-Themen 3
M Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Interfaces Abstrakte Klassen Java Basics - Anfänger-Themen 15
M Interface und Abstrakte Klassen Java Basics - Anfänger-Themen 12
D Methoden abstrakte Methoden und Rückgabewerte Java Basics - Anfänger-Themen 2
B Abstrakte Methode vs. Interface Java Basics - Anfänger-Themen 2
R Namenskonvention abstrakte Klassen Java Basics - Anfänger-Themen 6
C OOP Objektstruktur: abstrakte Klassen Java Basics - Anfänger-Themen 3
V Vererbung Abstrakte Methode Java Basics - Anfänger-Themen 3
T OOP abstrakte klassen - methoden Java Basics - Anfänger-Themen 8
M Abstrakte Klassen Java Basics - Anfänger-Themen 21
J Welchen Sinn haben abstrakte Methoden? Java Basics - Anfänger-Themen 4
D Abstrakte Klassen und Interfaces als Paramter in Funktionen Java Basics - Anfänger-Themen 3
T Interfaces: Braucht man abstrakte Klassen eigentlich noch? Java Basics - Anfänger-Themen 3
T OO, Konstruktor, abstrakte Methoden Java Basics - Anfänger-Themen 13
T Abstrakte Klassen Java Basics - Anfänger-Themen 6
C abstrakte Klassen mögen mich nicht... Java Basics - Anfänger-Themen 2
I Abstrakte Klassen Java Basics - Anfänger-Themen 8
D Zusammenfassung von Klassen (Vererbung? Abstrakte Klass? ...?) Java Basics - Anfänger-Themen 8
G Abstrakte Klassen und Methoden Java Basics - Anfänger-Themen 3
C Schnittstellen und Abstrakte Klassen Java Basics - Anfänger-Themen 3
I Abstrakte Klassen Java Basics - Anfänger-Themen 22
G Abstrakte Klassen ? Java Basics - Anfänger-Themen 9
nadoria abstrakte Klassen Java Basics - Anfänger-Themen 6
M Unterscheid Abstrakte Klassen/Interface Klassen? Java Basics - Anfänger-Themen 7
T abstrakte Klassen? Java Basics - Anfänger-Themen 2
G konkretes beispiel: interface hier besser als abstrakte kl. Java Basics - Anfänger-Themen 4
M abstrakte klassen und interfaces Java Basics - Anfänger-Themen 2
L abstrakte Methode nicht implementiert! Java Basics - Anfänger-Themen 5
M abstrakte klassen / Schnittstellen Java Basics - Anfänger-Themen 4
H abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 13
R Interfaces durch abstrakte Klassen ersetzbar? Java Basics - Anfänger-Themen 8
A Eine abstrakte Methode static machen? Java Basics - Anfänger-Themen 4
A Abstrakte Klassen und Interfaces Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben