Konstruktor
Startwerte für Attribute
Du hast vermutlich die Tierklasse so oder ähnlich implementiert:
class Tier {
var name = ""
var energie = 5
var glueckslevel = 10
}
Aufgabe 1
-
Erläutere, warum die Attribute
energieundglueckslevelim Kontext unseres Spiels mitvardefiniert werden müssen, während es eigentlich sinnvoll wäre, wenn das Attributnamemitvaldefiniert werden könnte. -
Beschreibe an der Code-Vorlage unten, warum es bei unserem Spiel nicht
sinnvoll möglich ist, für das Attribut
nameeinfachvardurchvalzu ersetzen.
class Tier {
val name = "" // name mit val definiert
var energie = 5
var glueckslevel = 10
}
fun main() {
val tier = Tier()
tier.name = "Wuffi"
println(tier.name)
}
Tipps zur Ausgabe mit println()
Wenn du die Ausgabe des Tiernamens etwas verschönern möchtest, so dass z.B. "Der Name des Tiers ist: Wuffi" ausgegeben wird, kannst du die Ausgabe von Zeichenketten mit Variablen oder anderen Ausdrücken kombinieren, z.B.
println("Der Name des Tiers ist: ${tier.name}")
Details und Beispiele findest du in den Tipps zu Kotlin.
Parameter für den Konstruktor
Bisher hatte der Konstruktor unserer Klasse Tier keine Parameter,
weshalb alle Tiere, die wir erzeugen, den gleichen Standardnamen, z.B.
eine leere Zeichenkette, haben.
Wir bräuchten also eine Möglichkeit, um folgenden Wunsch zu erfüllen:
Beim Erzeugen eines Tiers muss man den Namen des Tiers zwingend angeben. Es soll nicht möglich sein, ein Tier zu erzeugen, ohne einen Namen anzugeben. Der Wert des Parameters soll als Attribut gespeichert werden und danach nicht mehr verändert werden können.
Wir schauen uns eine mögliche Implementierung der Klasse Karte
aus dem vorherigen Teilkapitel an, um zu sehen, wie man das erreichen könnte:
class Karte(
val farbe: String,
val rang: String
) {
// Rest der Implementierung ...
}
Die Parameterliste kann auf mehrere Zeilen verteilt werden. Man kann die Parameter aber auch in einer einzigen Zeile angeben:
class Karte(val farbe: String, val rang: String) {
// Rest der Implementierung ...
}
Welche Variante man verwendet, ist Geschmackssache und hängt auch von der Zahl der Parameter ab.
Dass der Konstruktor der Klasse Parameter besitzt, stellt man üblicherweise auch im Klassendiagramm dar. Im Klassendiagramm gibt es keinen speziellen Bereich für Konstruktoren, weshalb man diese bei den Methoden mit auflistet. Eigentlich handelt es sich beim Konstruktor aber nicht um eine Methode, da man diesen zur Erzeugung eines Objekts benötigt, während Methoden erst auf einem bereits existierenden Objekt aufgerufen werden können.
Aufgabe 2
Tier mit einem Konstruktor,
der einen Parameter für den Namen des Tiers besitzt.
Die anderen Attribute sollen weiterhin mit Standardwerten versehen werden
und nicht über den Konstruktor gesetzt werden. Trage die Standardwerte
im Klassendiagramm ein.
Hinweis: Im Klassendiagramm kann man auch angeben, welchen Standardwert ein Attribut hat. Dazu ergänzt man hinter dem Datentyp ein Gleichheitszeichen und den Vorgabewert, z.B.:
energie: Int = 5
Aufgabe 3
-
Implementiere die Klasse
Tierso, dass sie die oben genannten Anforderungen erfüllt. Überlege dir, wie man es erreichen kann, dass der Name des Tiers beim Erzeugen eines Tiers zwingend angegeben werden muss und nicht mehr verändert werden kann, während die anderen Attribute weiterhin mit Standardwerten versehen werden und veränderbar bleiben. - Teste deine Implementierung mit Hilfe des Objektinspektors und des Codepads.
-
Schreibe ein Hauptprogramm, das
- zwei Tiere erzeugt
- den Namen und die Energie der Tiere ausgibt
- die Energie der Tiere verändert und erneut ausgibt
Hilfe
Ergänze die fehlenden Schlüsselwörter und den Datentyp. Bringe außerdem die Zeilen der Klasse und des Hauptprogramms in die richtige Reihenfolge.
class Tier(§§val§§ name: §§String§§) { §§fest
§§var§§ energie = 5 §§gruppe=attribute
§§var§§ glueckslevel = 10 §§gruppe=attribute
}
fun main() {
val tier1 = Tier("Wuffi") §§gruppe=objekte
val tier2 = Tier("Minka") §§gruppe=objekte
println(tier1.name) §§gruppe=ausgabe-vorher
println(tier1.energie) §§gruppe=ausgabe-vorher
println(tier2.name) §§gruppe=ausgabe-vorher
println(tier2.energie) §§gruppe=ausgabe-vorher
tier1.energie = 7 §§gruppe=aenderungen
tier2.energie = 3 §§gruppe=aenderungen
println(tier1.energie) §§gruppe=ausgabe-nachher
println(tier2.energie) §§gruppe=ausgabe-nachher
} §§fest