====== Auftrag AB7: Vererbung ====== Der Atommüll im Endlager rottet vor sich hin… keiner traut sich mehr hinein! Wenigstens sollte eine Aufstellung über die Anzahl der dort lagernden Fässer und der beschädigten Fässer, aus denen die abgebrannten Brennstäbe schon herausgefallen sind, gemacht werden. Eine neue Aufgabe für unseren Rescue-Robot... ===== Nicht jedes Mal muss man alles neu programmieren ...===== **Ziel:** Vererbung einsetzen, um Fähigkeiten eines Roboters in ein neues Modell zu übernehmen.. {{ .:ab701.png|}} Im AB5 hast du viele neue Sensoren für den Roboter programmiert, in AB6 hat er gelernt Schritte und Drehungen zu zählen. Aber dafür sind alle Fähigkeiten des AB5 wieder verloren gegangen. Natürlich könnte man per Copy-Paste die Methode in die neue Klasse übernehmen.Das geht aber auch eleganter. Du hast ja schon gemerkt, dass deine Roboter alles können, was ganz allgemein ein Roboter kann, ohne dass du jemals dafür eine einzige Methode hast kopieren müssen. Das liegt daran, dass deine ABx-Roboter Unterklassen der Klasse Roboter sind. Sie erben alle Eigenschaften und Fähigkeiten der Oberklasse, können sie dennoch erweitern oder verändern. Dies erreicht man durch folgende Anweisung am Anfang der Klasse, das Schlüsselwort hier ist ''extends'', also "erweitert": public class AB6 extends Roboter { ... } ==== Aufgabe 1 ==== Verändere die Klasse ''AB6_AB7'' so, dass sie nicht mehr eine direkte Unterklasse von Roboter sondern eine Unterklasse des AB5-Roboters ist. Sie erbt auf diese Weise alle seine Sensoren. Compiliere die Klasse neu. Wie verändert sich das Klassendiagramm? Überprüfe, dass der AB6_AB7-Roboter jetzt die Fähigkeiten des AB5-Roboters hat. Du findest sie unter ''inherited from AB5 >''. (inherited = engl. geerbt). ==== Aufgabe 2 ==== Erkläre, warum dein Roboter weiterhin auch die Fähigkeiten eines normalen Roboters hat. ==== Aufgabe 3 ==== Kreuzungen zählen: Implementiere im AB6_AB7 eine Methode ''zaehleKreuzungen()'', die einen Gang ans Ende zur Wand läuft und zählt an wie vielen Kreuzungen der Roboter vorbei kam. Benutze dazu einen der bei AB5 programmierten Sensoren. Speichere den Wert in einem geeigneten Attribut. Stelle auch eine ''get''-Methode zur Verfügung. Verschiebe zum Testen das Fass vor dem Roboter oben links, damit er einen Gang mit Kreuzungen vor sich hat. ===== Überschreiben von Methoden ===== Vererbung kann aber noch mehr. Man kann schon existierende Methoden auch verbessern. Beim letzten Arbeitsblatt wurde eine neue Methode ''einsVorMitZaehlen()'' eingeführt, die eine Verbesserung der Methode ''einsVor()'' des Standardroboters darstellt. Statt eine Methode mit einem neuen Namen zu erfinden, kann man auch die alte Methode verbessern. Ändere dazu den Namen der neuen Methode auf ''einsVor()''. Nun gibt es diese Methode zweimal. Einmal beim Roboter und einmal beim AB6_AB7-Roboter. Um die alte Methode aufzurufen musst du beim AB6_AB7-Roboter ''super.einsVor();'' schreiben (lies: rufe die Methode ''einsVor()'' bei der übergeordneten Klasse auf). ==== Aufgabe 4: Super ==== Ändere den Namen der Methode ''einsVorMitZaehlen()'' in ''einsVor()''. Rufe innerhalb dieser Methode die gleiche Methode der Oberklasse mit ''super.einsVor()'' auf. Anmerkung: Damit du die Klasse kompilieren kannst, muss du natürlich überall die Namensänderung vornehmen, wo du ''einsVorMitZaehlen()'' verwendet hast. Überprüfe die Auswirkungen dieser Änderung: * Rufe ''einsVor()'' beim AB6 auf. Beobachten die Auswirkung im Inspect-Fenster. * Rufe die von AB5 geerbte Methode ''laufeBisWand()'' auf. Beobachte im Inspect-Fenster. ==== Aufgabe 5: Brennstäbe zählen ==== Ändere die überflüssig gewordene Methode ''bisWandMitZaehlen()'', so dass sie zählt, wie viele Brennstäbe auf dem Weg zur Wand liegen (wir verwenden auf dem Testgelände natürlich nur ungefährliche Attrappen, die aber täuschend echt aussehen). Verwende dazu ''istAufGegenstand("Brennstab")''. Ergänze auch die dazugehörige ''get''-Methode. **Achtung:** Ein direkt vor der Wand liegender Brennstab muss auch erkannt werden. Erstelle eine neue Methode ''bisWAnd()'', die geradeaus bis zur nächsten Wand geht und dabei die Schritte zählt als Ersatz für die bisherige Methode ''bisWandMitZaehlen()''. ==== Aufgabe 6: Standardmethoden überschreiben ==== Überschreibe auf die gleiche Weise wie ''einsVor()'' die Methode ''dreheLinks'', ''dreheRechts'' und ''dreheUm'' von Roboter, so dass die Drehungen gezählt werden. //Überprüfe//, ob der Pledge-Algorithmus (''einsatz6()'') immer noch funktioniert. Beachte: Im Pledge Algorithmus muss ''bisWandMitZaehlen()'' durch die neue ''bisWand()'' Methode ersetzt werden, da ''bisWandMitZaehlen()'' nun Brennstäbe anstatt Schritte zählt. ==== Aufgabe 7: Fass links ==== {{ .:ab702.png|}} Implementiere einen neuen Sensor ''istFassLinks()'', der erkennt, ob links ein Fass (egal, ob ein normales oder ein Atommüllfass) ist. Verwende dazu den Sensor ''istFassVorne()'' (Öffne zum Vergleich AB 5). ==== Aufgabe 8: Überschreiben ==== Überschreibe die Methoden ''istWandVorne()'' und ''istWandLinks()'' so, dass sie ''true'' zurückgeben, wenn wirklich eine Wand vorne (''super.istWandVorne()'') bzw. links (''super.istWandLinks()'') ist oder wenn ein Fass vorne bzw. links ist. Verwende dazu die Sensoren ''istFassVorne()'' und ''istFassLinks()'' ==== Aufgabe 9 ==== Teste die Auswirkungen dieser Änderungen auf den Pledge-Algorithmus, indem du einige Fässer in der Welt platzierst. Erzeuge dazu mit einem Rechtsklick auf new Gegenstand(String name) einen neuen Gegenstand und gib als Name ''"Atommuell"'' oder ''"Fass"'' ein. ===== Einsatz 7: Atommüllendlager Asse ===== In einem alten Bergwerk wurde vor etlichen Jahren ein Atommüllendlager eingerichtet. Leider rosten die Fässer dort vor sich hin, so dass einige Brennstäbe in den Gängen herumliegen. Für Menschen ist es zu gefährlich, diese zu zählen, da sie stark strahlen. Außerdem ist das Bergwerk stark einsturzgefährdet. Jeden Moment kann es einen Steinschlag geben. Unser Roboter soll das übernehmen. {{ .:auswahl_030.png?500 |}} **Auftrag:** Zähle die Brennstäbe in den Gängen, hebe sie auf und kehre zum Portal zurück. **Hinweis:** * Auf dem Rundweg außen herum liegen keine Brennstäbe. * Mache dir vorher ein Bild von der Situation, indem du den ''Einsatz7'' startest. * Eventuell reicht die Energie nicht aus, um das Bergwerk zu verlassen. In diesem Fall musst du den Einsatz erneut ausführen. ---- [[..:ab6:start|<<< Zurück zu Level 6]] **Level 7** [[..:ab8:start|Weiter zu Level 8 >>>]] ---- Alle Arbeitsaufträge in diesem Namensraum basieren auf den Materialien von ''Schaller/Zechnall'' zur Informatikfortbildung Baden-Württemberg 2016 und stehen unter einer [[https://creativecommons.org/licenses/by-nc-sa/2.0/de/|CC-BY-SA-NC Lizenz]].