BlueJ Methoden und Objekte aus Subklassen holen

Keksz

Mitglied
Moin hab ein Problem mit dem aufrufen von Objekten und Methoden aus einer Subklasse in deren Superklasse. (Tank & Motorrad)

Hier mal die Problemschnipsel

Einmal die Subklasse Tank:
Java:
public class Tank extends Motorrad
{
    private float tankvolumen;
    private float tankinhalt;

    public Tank(float tankvolumen, float tankinhalt)
    {
        this.tankinhalt = tankinhalt;
        this.tankvolumen = tankvolumen;
        if (tankinhalt > tankvolumen)
        {
            throw new TankLaeuftUeberAusnahme("Tank ist zu klein für diese Menge!");
        }
        if (tankinhalt < 0)
        {
            throw new IllegalArgumentException("Negativer Wert nicht möglich!");
        }
    }

    [...]
}

Und die Superklasse Motorrad
Java:
public class Motorrad extends Zweirad
{
    public Motorrad(String typ, float kilometerstand, float hoechstGeschwindigkeit) 
    {
        super(typ, kilometerstand, hoechstGeschwindigkeit);
    }
    
    public void fahren(int distanz)
    {
        if (tankinhalt == 0) System.out.println("Tank leer"); //Ist der Tank leer kann man nicht fahren
        
       [...]       
    }

So jedenfalls hab ich jetzt hier das Problem in der Klasse Motorrad, wenn ich eine Methode definieren möchte zum fahren, wie ich die Werte für tankinhalt bekomme und später auch tankvolumen oder evtl auch noch andere.
Genauso wie ich später Methoden aus der Subklasse aufrufen möchte wie z.B. "gib Tankinhalt" etc.
Mit set und get krieg ich es nicht hin, wobei ich sagen muss, dass ich auch noch nicht all zu sehr vertraut bin mit diesen.
Also was muss ich tun? Bin offen für Hilfsansätze und Beispiele...
 

XHelp

Top Contributor
Motorrad hat doch mit dem Tank nichts zu tun, was willst du da aufrufen?
Warum erbt bei dir ein Tank überhaupt vom Motorrad? Ein Motorrad sollte einen Tank haben, aber bei dir ist ein Tank ein Motorrad :bahnhof:
 

Keksz

Mitglied
Motorrad hat doch mit dem Tank nichts zu tun, was willst du da aufrufen?
Warum erbt bei dir ein Tank überhaupt vom Motorrad? Ein Motorrad sollte einen Tank haben, aber bei dir ist ein Tank ein Motorrad :bahnhof:

Hmm gute Frage. Ich hab mich lediglich an die Aufgabenstellung gehalten 8(

" b. Erstellen Sie die Klasse Tank. (Denken Sie auch an die Kommentierung.)
c. Integrieren Sie den Tank in das Motorrad. Lassen Sie im ersten Anlauf alle auftretenden
Ausnahmen in der Aufrufhierarchie nach oben wandern. Testen Sie!"
 

Keksz

Mitglied
Und wo steht da jetzt: "Leiten sie die Klasse Tank von der Klasse Motorrad ab"?

Okay das steht da nicht aber das hab ich jetzt einfach daraus geschlossen weil da noch stand:
"Das Motorrad soll einen Tank haben und alle Methoden, welche sich mit dem Nachfüllen
und dem Verbrauch von Kraftstoff beschäftigen, sollen die Methoden des Tankobjektes
benutzen (Delegation)."

Aber ok ich sehe das macht keinen Sinn Tank als Subklasse von Motorrad zu haben. Danke. Nichtsdestotrotz muss ich ja irgendwie die Methoden und Objekte aus der Klasse laden um eben eine "fahren-Methode" zu realisieren.
 

XHelp

Top Contributor
Naja, du machst:
Java:
public class Tank {
  private double inhalt;
  private double fassungsVermoegen;
  //und anderen Kram
}
Und in der Motorrad-Klasse:
Java:
...
  private Tank tank;
  Konstruktor {
    tank = new Tank();
  }
  fahren {
    tank.machWasAuchImmer();
  }
(mal von der Syntax abgesehen)
 

Keksz

Mitglied
Hmm wenn ich denn jetzt fahre und dabei Kraftstoff verbrauche und dabei dann eine bereits vorhandene Exception werfen möchte (TankLeerAusnahme) mache ich das dann in einem try catch block? Und wenn ja, wie?

Edit: Außerdem kann ich ja nun mit der Art wie vorgeschlagen trotzdem noch nicht auf Methoden aus der Tank Klasse zugreifen - oder etwa doch? Denn wenn ich jetzt

Java:
fahren( ... )
{
...
tank.KraftstoffEntnehmen(); //Die Methode aus der Klasse Tank die definiert wie kraftstoff entnommen wird
...
}

Dann funktioniert das nicht
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Es wurde zwar schon thematisiert, aber noch ein anderer Weg der Erklärung:

Eine Ableitung kann als "ist ein" ausgesprochen werden.

Ein Motorrad "ist ein" Zweirad -> das ist ok
Ein Tank "ist ein" Motorrad -> Falsch

Ein Motorrad "hat einen" Tank -> "hat" ist eine Assoziation. In diesem Fall ist eine "has" Beziehung angebracht. Das ist in UML die mit dem ausgefüllten Kringel am Anfang (also beim Motorrad) und es ist sicher eine 1 zu 1 Beziehung. (Ich kenne keine Motorräder ohne Tank und auch keine solchen mit mehr als einem :) )
 

Neue Themen


Oben