s n h m r u

Minimallogo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

s n h m r u
i

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

Mache 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:

Spielfeld ist eine Unterklasse von World

Denselben Pfeil siehst du auch in der Projektansicht von BlueJ zwischen Spielfeld und World.

Aufgabe 2

Erzeuge ein 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

Erkläre die Fehlermeldung in eigenen Worten. Benutze dein Wissen über Datentypen aus den vorherigen Teilkapiteln.

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

Überlege bei jedem Vorschlag, ob er sich kompilieren lässt und was er auf dem Spielfeld anzeigt. Überprüfe deine Vermutungen anschließend in BlueJ. Bewerte die Vorschläge und baue den aus deiner Sicht besten in act ein.
Die Methode 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.

Suche

v
100.123.2.2.3 Unterklasse von World
Kopieren durch Anklicken

Rückmeldung geben