Enums in Klassen
Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 44 von 65.
Ein Enum kann innerhalb einer Klasse neben ihren Variablen deklariert werden. Die Optionen gehören dann zu dieser Klasse:
# weapon.gd
class_name Weapon
extends RefCounted
enum Kind { SWORD, BOW, STAFF }
var kind: Kind
func _init(weapon_kind: Kind) -> void:
kind = weapon_kind
func is_ranged() -> bool:
return kind == Kind.BOW or kind == Kind.STAFFIn weapon.gd heißt das Enum Kind. In jeder anderen Datei steht zuerst der Klassenname, Weapon.Kind.BOW, in Werten, Typannotationen und match-Mustern:
# blacksmith.gd
class_name Blacksmith
extends RefCounted
static func repair_cost(kind: Weapon.Kind) -> int:
match kind:
Weapon.Kind.SWORD:
return 20
Weapon.Kind.BOW:
return 15
return 30Die Optionen sind weiterhin Zahlen: Weapon.new(Weapon.Kind.BOW).kind gibt 1 aus. Das Enum selbst funktioniert wie ein Wörterbuch, das Namen Zahlen zuordnet:
print(Weapon.Kind.keys()) # ["SWORD", "BOW", "STAFF"]
print(Weapon.Kind.find_key(1)) # BOW
print(Weapon.Kind["STAFF"]) # 2
print(Weapon.Kind.size()) # 3
for kind in Weapon.Kind.values():
print(Weapon.Kind.find_key(kind), ": ", Blacksmith.repair_cost(kind))Die Schleife gibt SWORD: 20, BOW: 15 und STAFF: 30 aus. GDScript prüft nicht, ob eine Zahl eine der Optionen ist: Weapon.new(7) erzeugt eine Waffe, deren kind 7 ist. Übergib die benannten Optionen, dann bleibt der Code korrekt.
Ein Enum, das eine Klasse beschreibt, gehört in diese Klasse, damit Leser sehen, woher Kind in Weapon.Kind.BOW kommt.
Aufgabe
EinfachSortiere Tränke mit einer Aufzählung, die in der Klasse Potion enthalten ist.
- Definiere in
potion.gdenum Kind { HEAL, MANA, POISON }und gibkindden TypKind. Potion.from_text(text, strength)ist eine statische Funktion, die"MANA"inKind.MANAumwandelt und einen neuen Trank zurückgibt.describe()gibtHEAL potion: +20 HP,MANA potion: +15 MPoderPOISON potion: -5 HPzurück und verwendet dabei den Namen der Art und die Stärke.- In
belt.gdgibtsummary()eine Zeile pro Art in der Reihenfolge der Aufzählung zurück:HEAL: 2 (35 total), mit der Anzahl der Tränke dieser Art und in Klammern der Summe ihrer Stärke. Auch Arten ohne Tränke erhalten eine Zeile.
Der bereitgestellte Code liest ein, wie viele Tränke folgen (HEAL 20), fügt jeden dem Gürtel hinzu, gibt dessen Beschreibung aus und danach die Zusammenfassung. Für HEAL 20, POISON 5, HEAL 15 gibt er Folgendes aus:
Added HEAL potion: +20 HP
Added POISON potion: -5 HP
Added HEAL potion: +15 HP
HEAL: 2 (35 total)
MANA: 0 (0 total)
POISON: 1 (5 total)Dein Code gehört in potion.gd und belt.gd. main.gd enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
extends Node
func _ready():
# Vorgegebener Ein-/Ausgabecode: unverändert lassen
var belt := Belt.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
var potion := Potion.from_text(parts[0], int(parts[1]))
belt.add(potion)
print("Added ", potion.describe())
for line in belt.summary():
print(line)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort selfMethodenEigenschaftenKonstruktor (_init)Wiederholung – Einfacher Taschenrechner4Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypisierungAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner2Klassenattribute
Instanz- vs. statische VariablenStatische FunktionenProperty-SetterProperty-GetterPrivat nach KonventionWiederholung – Bankkontenverwaltung5Kapselung
Öffentliche und private MemberValidierung mit SetternInformationsverbergenSchreibgeschützte EigenschaftenRückblick – System zur Schülerverwaltung8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungInnere KlassenNodes als KomponentenRefCounted vs. NodeEnums in Klassen11Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungVererbungskettenTypprüfungen mit isWiederholung – Mitarbeiterhierarchie6Spezielle Methoden
Einführung in virtuelle MethodenDie _to_string-MethodeBenutzerdefinierte IteratorenRückblick – Benutzerdefinierte Liste9Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBeobachter-MusterStrategie-Muster12Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungÜbe selbstständig: Online-GDScript-Compiler