Vererbung - Aufgabe

Neue Frage »

Auf diesen Beitrag antworten »
Björn Vererbung - Aufgabe

Meine Frage:
Hey Leute,

folgende Aufgabenstellung:

Für die Kfz-Datenbank einer Behörde sollen in einer ersten Ausbaustufe nur Pkws und Lkws betrachtet
werden. Für beide Kfz-Typen soll das Kennzeichen und die PS-Zahl gespeichert werden, für Pkws
zusätzlich die Anzahl der Sitzplätze, für Lkws zusätzlich das zulässige Gesamtgewicht. (Später werden
noch viele weitere Daten, sowie Motorräder etc. hinzukommen.) Definieren Sie geeignete Klassen
Kfz, Pkw und Lkw, jeweils mit einer print()-Funktion zur Ausgabe der Daten. (D.h. auch die Klasse Kfz
hat eine print()-Funktion für die Ausgabe der Kfz-Daten. Als Testprogramm für Ihre Klassen legen Sie
in der main()-Funktion einen Pkw und einen Lkw an und geben deren Werte aus. Achten Sie auf guten
objektorientierten Zugriffsschutz, d.h. alle Elemente in allen Klassen sind private.

Meine Ideen:
Meine ersten Lösungsansätze (leider macht mir der jeweils der super () - Aufruf in Zeile 8 Schwierigkeiten und ich weiß nicht warum. Ich möchte doch die Eigenschaften kennzeichen und PS von der Basisklasse erben?)

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
package javakfz;

public class JavaKFZ 
{

    public static void main (String [] args)
    {
        String kennzeichen;
        float ps; 
        
        PKW pkw = new PKW ("AAA-LB-123",102.4F,4);
        LKW lkw = new LKW ("BBB-LA-32",12.4F,43.2F);
    }
    
}



Klasse KFZ:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
package javakfz;

public class PKW extends JavaKFZ
{
    public PKW (String kennzeichen, float ps, int sitze)
    {
        super (kennzeichen,ps);
        this.sitze = sitze; 
    }
    private int sitze; 

    public void setSitze (int sitze)
    {
        this.sitze = sitze; 
    }
    
    public int getSitze ()
    {
        return sitze; 
    }
}



Klasse LKW:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
package javakfz;

public class LKW extends JavaKFZ
{
    public LKW (String kennzeichen, float ps, float gesamtgewicht)
    {
        super (kennzeichen,ps);
        this.gesamtgewicht = gesamtgewicht;
    }
    
    private float gesamtgewicht; 

    public void setGesamtgewicht (float gesamtgewicht)
    {
        this.gesamtgewicht = gesamtgewicht;
    }
   
    public float getGesamtgewicht ()
    {
        return gesamtgewicht; 
    }
}





Vielen Dank für Eure Antworten :-)
 
Auf diesen Beitrag antworten »
eulerscheZahl

Du brauchst noch eine Klasse KFZ, von der sollst du erben.
Und die muss auch einen Konstruktor haben, der 2 Argumente entgegennimmt.
Auf diesen Beitrag antworten »
Templex

Hallo,

wie die eulerscheZahl schon schreibt. Eine Oberkalsse KFZ wäre an der Stelle sehr hilfreich. Dieser Klasse kannst du dann auch die gemeinsamen Attribute, also diejenigen die beide Unterklassen gemeinsam haben, verpassen.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public class KFZ{
   protected String kennzeichen;
   protected float ps;

   public KFZ(String kennzeichen, float ps){
      this.kennzeichen = kennzeichen;
      this.ps = ps;
   }

   // getters and setters come here

}


Anschließend kannst du von dieser Klasse erben, und die spezielleren Attribute, also die die jeweils nur der LKW oder der PKW haben soll, dort spezifizieren. Und Dann funktioniert auch super. Beispielsweise so:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public class PKW extends KFZ{
   protected int sitze;

   public PKW(String kennzeichen, float ps, int sitze){
      super(kennzeichen, ps);
      this.sitze = sitze;
   }

   // getters and setters come here

}


Weiterhin ist es üblich die Attribute einer Klasse an den Anfang der selbigen zu schreiben. Dort sind sie besser zu finden, als zwischen den einzelnen Methoden. Ist aber nur eine Konvention zur Verbesserung der Lesbarkeit deines Codes.

Ich hoffe ich konnte helfen,
Tplex
Auf diesen Beitrag antworten »
Björn

Vielen Dank Euch beiden für die Hilfe :-)
 
Auf diesen Beitrag antworten »
Björn

Eine Frage hätte ich noch:

Ich habe mein Kennzeichen und die PS jetzt auf private gesetzt und mit getter- und setter Methoden gearbeitet. Bekomme aber in den Subklassen die Fehlermeldung, dass Kennzeichen und PS private Access haben. Mir ist klar, dass es mit protected bzw. public funktioniert, aber ist das mit private nicht möglich?

Hier noch einmal der Code (jetzt auch mit den toString - Methoden)

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
package javakfz;


Die Main - Funktion: 

public class JavaKFZ 
{
    public static void main (String [] args)
    {
        PKW pkw = new PKW ("AAA-LB-123",102.4F,4);
        System.out.println(pkw.toString());
        LKW lkw = new LKW ("BBB-LA-32",12.4F,43.2F);
        System.out.println(lkw.toString());
    }
}




Die Oberklasse KFZ:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
package javakfz;

public class KFZ 
{
    private String kennzeichen;
    private float ps; 
    
    public KFZ (String kennzeichen, float ps)
    {
        this.kennzeichen = kennzeichen;
        this.ps = ps; 
    }
    
    public void setKennzeichen (String kennzeichen)
    {
        this.kennzeichen = kennzeichen;
    }
    
    public String getKennzeichen ()
    {
        return kennzeichen;  
    }

    public void setPS (float ps)
    {
        this.ps = ps;
    }
    
    public float getPS ()
    {
        return ps;  
    }
}



Die Subklasse PKW:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
package javakfz;

public class PKW extends KFZ
{
    private int sitze; 
    public PKW (String kennzeichen, float ps, int sitze)
    {
        super (kennzeichen,ps);
        this.sitze = sitze; 
    }
    
    public void setSitze (int sitze)
    {
        this.sitze = sitze; 
    }
    
    public int getSitze ()
    {
        return sitze; 
    }
    
    @Override
    public String toString ()
    {
        return String.format("Kennzeichen: %s, PS: %s, Sitze %s", kennzeichen,ps,sitze);
    }

}


Die zweite Subklasse LKW:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
package javakfz;

public class LKW extends KFZ
{
    public LKW (String kennzeichen, float ps, float gesamtgewicht)
    {
        super (kennzeichen,ps);
        this.gesamtgewicht = gesamtgewicht;
    }
    
    private float gesamtgewicht; 

    public void setGesamtgewicht (float gesamtgewicht)
    {
        this.gesamtgewicht = gesamtgewicht;
    }
   
    public float getGesamtgewicht ()
    {
        return gesamtgewicht; 
    }

    @Override
    public String toString ()
    {
        return String.format("Kennzeichen: %s , PS: %s , Gesamtgewicht: %s", kennzeichen, ps, gesamtgewicht);
    }
}





Vielen Dank für die Antworten ;-)
Auf diesen Beitrag antworten »
eulerscheZahl

Wenn ein Feld private ist, kannst du auch mit der abgeleiteten Klasse nicht darauf zugreifen, das ist die Definition von private. Du kannst stattdessen den getter verwenden:
code:
1:
String.format("Kennzeichen: %s, PS: %s, Sitze %s", getKennzeichen(), getPS(), sitze);
Auf diesen Beitrag antworten »
Björn

Super, vielen Dank für deine Antwort.

Der Rest hat soweit gepasst?
Auf diesen Beitrag antworten »
eulerscheZahl

Ja.
Auf diesen Beitrag antworten »
Björn

Super, vielen Dank :-)
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »