10.2 Kapselung und Vererbung
Aufgabe 10-3: Welche Implementierung der Methode blinken() ist korrekt?
-
Worin unterscheiden sich die beiden Implementierungsversuche der Methode
blinken()(vgl. Abb. 10-6a und 10-6b)? - Lesen Sie den Abschnitt „Merke: Kapselung und Vererbung“. Welcher der beiden Implementierungsversuche ist korrekt und welcher fehlerhaft? Begründen Sie Ihre Meinung.
Lösung
-
Der erste Versuch die Methode
blinken()zu implementieren versucht direkt auf das Attributfarbezuzugreifen und diesem einen Wert zuzuweisen. Der zweite Versuch greift nicht direkt auf das Attributfarbezu, sondern nutzt hierfür die geerbte öffentliche MethodesetFarbe(pFarbe: String). -
Die Klasse
RoboterErweitertist eine Unterklasse der KlasseRoboter. Sie besitzt daher auch deren Attributfarbe. Da das Attribut in der KlasseRoboterals privat deklariert worden ist, darf auch eine Unterklasse nicht direkt darauf zugreifen. Der erste Implementierungsversuch ist daher nicht korrekt.
Der zweite Implementierungsversuch nutzt stattdessen die von der KlasseRobotergeerbete MethodesetFarbe(pFarbe: String). Diese Methode ist in der KlasseRoboterals öffentlich deklariert worden. Wie jede Klasse darf die Unterklasse daher darauf zugreifen.
public void blinken() {
this.farbe = "rot";
this.farbe = "gelb";
this.farbe = "blau";
this.farbe = "weiss";
}
}
blinken()public void blinken() {
this.setFarbe("rot");
this.setFarbe("gelb");
this.setFarbe("blau");
this.setFarbe("weiss");
}
}
blinken()Das Prinzip der Kapselung besagt, dass der direkte Zugriff auf private Attribute und private Methoden nur innerhalb der Klasse möglich ist, in der diese deklariert sind. Diese strikte Regel wird auch bei einer Vererbung nicht außer Kraft gesetzt. Das heißt, eine Unterklasse besitzt zwar auch die privaten Attribute und privaten Methoden ihrer Oberklasse, allerdings darf sie darauf nicht direkt zugreifen.
Bei öffentlichen Methoden, die die Unterklasse von ihrer Oberklasse erbt, gibt es natürlich keine Zugriffsbeschränkung. Verfügt die Oberklasse über öffentliche Methoden, die einen kontrollierten Zugriff auf ihre privaten Attribute oder privaten Methoden erlauben (zum Beispiel set- und get-Methoden), so können diese auch aus der Unterklasse aufgerufen werden.
Aufgabe 10-4: robi.beschleunige()
Erstellen Sie in der Klasse RoboterErweitert die öffentliche Methode beschleunige(). Sofern der Roboter noch nicht seine Höchstgeschwindigkeit von 4 erreicht hat, soll der Aufruf dieser Methode seine Geschwindigkeit um 1 erhöhen.
Lösung
public void beschleunige() {
int aktuelleGeschwindigkeit = this.getGeschwindigkeit();
if(aktuelleGeschwindigkeit<4) {
this.setGeschwindigkeit(aktuelleGeschwindigkeit+1);
}
}
}
beschleunige()