Unterklasse von World
Noch keine BluePlay-Welt
Dein Spielfeld funktioniert - aber es ist noch eine ganz normale Klasse:
Es öffnet sich kein Spielfenster, und act läuft nur, wenn du
selbst per Rechtsklick darauf klickst.
Beim Goldrausch-Projekt war das anders: Dort öffnete
show() ein Fenster mit Steuerleiste, und nach einem Klick auf
Start lief das Spiel von allein.
Der Grund: Beim Goldrausch-Projekt war die Klasse
Spielfeld eine Unterklasse der
BluePlay-Klasse World.
Du weißt bereits: Objekte einer Unterklasse besitzen automatisch alle
Attribute und Methoden der Oberklasse.
Genau das fehlt unserem Spielfeld noch.
World als Oberklasse
Die Oberklasse gibst du in Kotlin mit einem Doppelpunkt hinter dem
Klassennamen an.
Bei World musst du dabei drei Werte übergeben: die Breite und
die Höhe des Feldes in Zellen sowie die Größe einer Zelle in Pixeln.
class Spielfeld: World(600, 400, 1) {
...
}
Aufgabe 1
World zur Oberklasse deines Spielfelds und kompiliere.
Du bekommst eine Fehlermeldung, die die Methode act betrifft.
Lies sie genau: Was teilt dir der Compiler mit?
Überschreiben mit override
Die Fehlermeldung lautet:
error: 'act' hides member of supertype 'World' and needs an 'override' modifier.
Die Klasse World besitzt nämlich selbst schon eine Methode mit
dem Namen act - und dein Spielfeld hat sie geerbt.
Deine eigene Methode act soll die geerbte Methode ersetzen.
Man sagt dazu auch: Sie überschreibt die geerbte Methode.
Das musst du in Kotlin ausdrücklich dazuschreiben - mit dem Schlüsselwort
override:
override fun act() {
...
}
Geerbte Methoden nutzen
Ab jetzt kann dein Spielfeld alles, was eine BluePlay-Welt kann. Im Klassendiagramm stellt man die Vererbung mit einem Pfeil dar, der ein dreieckiges Ende hat und von der Unterklasse zur Oberklasse zeigt:
Denselben Pfeil siehst du auch in der Projektansicht von BlueJ zwischen
Spielfeld und World.
Aufgabe 2
Spielfeld-Objekt und rufe seine geerbte Methode
show() auf - du findest sie wie beim Goldrausch-Projekt
im Untermenü inherited from World.
Starte das Spiel mit dem Start-Knopf und beobachte das Terminal.
Erkläre, warum act jetzt von allein läuft, vorher aber nicht.
Ausgabe auf dem Spielfeld
Die Ausgabe der Schritte im Terminal ist unpraktisch - schöner wäre sie
direkt auf dem Spielfeld.
Auch dafür hat dein Spielfeld eine Methode geerbt:
showText(text, x, y) zeigt einen Text an der Position
(x, y) an.
Der naheliegende Versuch sieht so aus:
showText(schritte, 100, 50)
Das lässt sich allerdings nicht kompilieren:
error: argument type mismatch: actual type is 'Int', but 'String' was expected.
Aufgabe 3
Vorschläge zur Behebung
Hier sind vier Vorschläge, wie man das Problem lösen könnte:
// Vorschlag 1
showText("schritte", 100, 50)
// Vorschlag 2
showText("$schritte", 100, 50)
// Vorschlag 3
showText(schritte.toString(), 100, 50)
// Vorschlag 4
showText("Schritte: $schritte", 100, 50)
Aufgabe 4
act ein.
toString() aus Vorschlag 3 besitzen in Kotlin alle
Objekte: Sie liefert den Wert als Zeichenkette, wandelt also z.B. die Zahl
7 in den Text "7" um.
Die String-Templates mit dem Dollarzeichen kennst du schon -
sie rufen im Hintergrund automatisch toString() auf.