Vererbung - Ausgabe von private Variablen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Vererbung - Ausgabe von private Variablen

    Hallo,

    wir haben in der Schule das Thema Verebrung angefangen und haben eine Oberklasse Fahrzeuge und Unterklassen wie Muskelkraft, Motorkraft, PKW, LKW, Limousine, Coupe usw.
    Jetzt haben wir 2 Objekte erstellt und mit dem Konstruktor die Werte übergeben.
    Diese Werte vom Objekt sollen jetzt ausgegeben werden, allerdings ohne get Methode.

    Ich bin jetzt bisschen verwirrt, mir ist nicht klar wie ich die Varialben ausgeben soll wenn alle private deklariert sind.

    Quellcode

    1. public class Limousine extends PKW
    2. {
    3. private boolean Minibar;
    4. private String Fahrername;
    5. public Limousine(double Gewicht, double Größe, String Bezeichnung, double Verbrauch, int Leistung, int Sitzplätze, int Türen, boolean Minibar, String Fahrername)
    6. {
    7. super(Gewicht, Größe, Bezeichnung, Verbrauch, Leistung, Sitzplätze, Türen);
    8. this.Minibar = Minibar;
    9. this.Fahrername = Fahrername;
    10. }
    11. }
    Alles anzeigen


    Bei dieser Klasse könnte ich jetzt eine Ausgabe Klasse machen wo die Werte Minibar und Fahrername ausgegben werden. Allerdings sind das nur dann die beiden und nicht die andere Werte wie Gewicht, Größe, Bezeichnung.
    Was ich mir noch überlegt habe, bei jeder Klasse so eine Ausgabe Methode wo die Werte dann drinstehen und dann immer von der unteren Klasse abrufen lassen. Erstens finde ich das jetzt nicht unbedingt sauber bzw. hat man dann bestimmt unnötig soviele Methoden und außerdem weis ich nicht wie ich die Ausgabe Methoden verknüpfe anstatt jeder Methode einen eigenen Namen zugeben.

    Wir haben noch nichts mit protected Variablen gemacht. Wäre das die Lösung?

    Danke!
  • also mit protected variablen geht das auf jedenfall, da können Unterklassen problemlos drauf zugreifen.

    Was ich mir noch überlegt habe, bei jeder Klasse so eine Ausgabe Methode wo die Werte dann drinstehen und dann immer von der unteren Klasse abrufen lassen. Erstens finde ich das jetzt nicht unbedingt sauber bzw. hat man dann bestimmt unnötig soviele Methoden und außerdem weis ich nicht wie ich die Ausgabe Methoden verknüpfe anstatt jeder Methode einen eigenen Namen zugeben.
    Das klingt doch garnicht schlecht. Wenn du eine Ausgabe (oder erstmal einen String) erzeugen willst, der ein Objekt Charakterisiert, gäbe es die Möglichkeit einfach Object.toString() zu überschreiben. Diese ist dafür da einen String zu erzeugen, der das Objekt beschreibt und für Menschen gut lesbar ist.
    Daher kannst du in der Superklasse eine toString Methode schreiben, die die Basiseigenschaften eines PKWs enthält. In der abgeleiteten Klasse überschreibst du toString dann nochmal, rufst in dieser Methode super.toString() auf und hängst an den dann erhaltenden String noch die speziellen Informationen der Unterklasse an und "returnst" dann den ganzen String.
    So würde ich das auf jedenfall machen ;)
  • Ich weiß ja nicht wie du die superklasse geschrieben hast....also ob die attribute private sind, oder so....

    Ich würde dir empfehlen eine print methode zu proggen....

    Quellcode

    1. System.out.println("Gewicht: "+super.gewicht);
    2. System.out.println("Größe: "+super.größe);
    3. System.out.println("Bezeichnung: "+super.bezeichnung);
    4. System.out.println("Verbrauch: "+super.verbrauch);
    5. System.out.println("Leistung: "+super.leistung);
    6. System.out.println("Sitzplätze: "+super.sitzplätze);
    7. System.out.println("Türen: "+super.türen);
    8. System.out.println("Minibar: "+this.minibar);
    9. System.out.println("Fahrername: "+this.fahrername);


    ...also ich würde sagen eine Methode sollte man dann nicht als übers Ziel hinausgeschossen bezeichnen....naja, aber ich kenne die genaue Aufgabenstellung nicht.

    mfg maxbrauner
    Rechtschreibfehler sind ein Gimmick meiner TAstatur
  • @Rondrer

    Ich weis aber nicht wie ich auf so eine mittlere Klasse zugreife also z.B.

    Super Klasse -> PKW -> Limousine

    Super Klasse hat ne Methode toString() oder Ausgabe() und da werden die Werte ausgegeben.
    PKW hat dann auch eine Methode die genau so heißt (oder ?) und ich rufe dann super.Ausgabe() auf um die anderen Werte zu kriegen.
    Wie kann ich jetzt aber bei Limousine auf die Methode von PKW zugreifen? Wenn ich wieder eine Methode mache und super.Ausgabe() dann habe ich nur die Ausgabe von der Super Klasse und von Limousine.

    @maxbrauner

    Alle Attribute sind private, somit kann ich nicht auf die Attribute der davorigen Klasse zugreifen.

    EDIT: Welche Nachteile hätte es wenn man alle Varialben auf protected setzt? Ich kann ja dann auch von der Main Klasse zugreifen..
  • Also super.super.? klappt nicht.

    Ich habe jetzt bei jeder Klasse eine Methode mit dem Namen Ausgabe()

    Quellcode

    1. public void Ausgabe()
    2. {
    3. super.Ausgabe();
    4. System.out.println("Verbrauch: "+Verbrauch+" l/100km");
    5. System.out.println("Leistung: "+Leistung+" PS");
    6. }


    Wundert mich jetzt das es doch irgendwie klappt. Die Methoden werden doch auch vererbt, hat man dann nicht doppelte Methoden? oder Überschreibt die untere Klasse die vererbte Methode?

    Danke schonmal!
  • Illidan schrieb:

    oder Überschreibt die untere Klasse die vererbte Methode?

    Genau das passiert. Mittels super hast du aber immer noch die Möglichkeit auf die Methode der Vaterklasse zuzugreifen und kannst diese somit erweitern, eben das was du (richtigerweise) gemacht hast.

    Anmerkung: Variablen- und Methodennamen sollten immer mit einem kleinen Buchstaben beginnen. Klassennamen hingegen mit einem großen. Das ist üblich und erleichtert anderen das Lesen.
  • Wegen dem super.super...sry...war my fault.

    du kannst in der Obersten Klasse eine print methode schreiben die in der davon abgeleiteten Klasse wieder drauf zugreift.

    Quellcode

    1. public class SuperKlasse {
    2. public void print(){
    3. //Drucke SuperKlasse
    4. }
    5. }
    6. public class PKW {
    7. public void print(){
    8. super.print(); /* ruft SuperKlasse print auf*/
    9. //Drucke PKW
    10. }
    11. }
    12. public class Limousine{
    13. public void print(){
    14. super.print(); /* ruft PKW print auf*/
    15. //Drucke Limousine
    16. }
    17. }
    Alles anzeigen


    In diesem Beispieltext wird in Limousine die print-Methode von PKW aufgerufen, in der wiederum die SuperKlasse print-Methode aufgerufen wird.

    Hoffe hiermit helfe ich dir mehr weiter wie mit meinem vorherigen QT

    mfg maxbrauner
    Rechtschreibfehler sind ein Gimmick meiner TAstatur