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. Bei einfachen Variablen kannst du diese direkt mit einem Dollarzeichen davor in die Ausgabe einfügen, z.B.
println("Der Name des Tiers ist: $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 Abscnnitt an, um zu sehen, wie man das erreichen könnte:
class Karte(
val farbe: String,
val rang: String
) {
// Rest der Implementierung ...
}
Da Zeilenumbrüche in Kotlin keine Bedeutung haben, könnte man die Parameter 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 Klassendiagram 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.
Aufgabe 3
Implementiere die Klasse Tier so, 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 einem Hauptprogramm, in dem du
- zwei Tiere erzeugst
- den Namen, die Energie und das Glückslevel der Tiere ausgibst
- die Werte für Energie und Glückslevel veränderst und erneut ausgibst
Alternativ zur Implementierung in BlueJ kannst du auch hier online arbeiten:
class Tier
fun main() {
}