Vererbungsketten
Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 18 von 65.
Eine untergeordnete Klasse kann selbst eine übergeordnete Klasse sein. Jedes extends fügt der Vererbungskette eine Ebene hinzu:
# vehicle.gd
class_name Vehicle
extends RefCounted
var wheels: int
func _init(w: int) -> void:
wheels = w
func describe() -> String:
return "%d wheels" % wheels# car.gd
class_name Car
extends Vehicle
func _init() -> void:
super(4)
func describe() -> String:
return "Car with " + super()# race_car.gd
class_name RaceCar
extends Car
var top_speed: int
func _init(speed: int) -> void:
super()
top_speed = speed
func describe() -> String:
return super() + ", top speed %d" % top_speedRaceCar hat alles von Car und Vehicle. Jedes super() geht eine Ebene nach oben, sodass ein Aufruf alle drei Versionen von describe() ausführt:
print(RaceCar.new(300).describe())Car with 4 wheels, top speed 300Wenn du eine Methode aufrufst oder eine Variable ausliest, sucht Godot zuerst in der eigenen Klasse des Objekts, dann in dessen übergeordneter Klasse und anschließend in der übergeordneten Klasse dieser Klasse und verwendet den ersten Treffer. RaceCar.new(300).wheels wird in Vehicle gefunden, zwei Ebenen höher.
Jede Klasse hat genau eine übergeordnete Klasse. extends nimmt eine einzelne Klasse entgegen, und zwei aufzulisten führt zu einem Parsing-Fehler:
class_name FlyingCar
extends Car, PlaneParse Error: Expected end of statement after superclass, found "," instead.GDScript unterstützt keine Mehrfachvererbung. Wenn eine Klasse die Funktionen zweier Klassen benötigt, füge sie in einer Vererbungskette zusammen oder gib ihr ein Objekt der anderen Klasse, mit dem sie arbeiten kann (ein späteres Kapitel behandelt dies).
Aufgabe
Einfachcharacter.gd enthält die fertige Klasse Character: einen Namen, hp, describe(), das NAME (HP HP) zurückgibt, und attack(), das 1 zurückgibt. Baue darauf zwei weitere Ebenen auf:
Warriorerbt vonCharacterund fügtstrengthhinzu. Sein Konstruktor übergibt den Namen und hp ansuper().describe()fügt dem Text der Elternklasse, strength Shinzu, undattack()gibt die Stärke zurück.Knighterbt vonWarriorund fügtarmorhinzu. Sein Konstruktor übergibt den Namen, hp und strength ansuper().describe()fügt dem Text vonWarrior, armor Ahinzu, undattack()gibt den Angriff vonWarriorplus5zurück.
Der bereitgestellte Code liest ein, wie viele Charaktere folgen, dann eine Zeile pro Charakter: character NAME HP, warrior NAME HP STRENGTH oder knight NAME HP STRENGTH ARMOR. Er gibt describe() und den Angriff aus. Für knight Arthur 120 15 8 gibt er Folgendes aus:
Arthur (120 HP), strength 15, armor 8
Attack: 20Dein Code gehört in warrior.gd und knight.gd. main.gd enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
extends Node
func _ready():
# Vorgegebener Eingabe-/Ausgabecode: unverändert lassen
var count := int(OS.read_string_from_stdin())
for i in count:
var p := OS.read_string_from_stdin().split(" ")
var c: Character
if p[0] == "knight":
c = Knight.new(p[1], int(p[2]), int(p[3]), int(p[4]))
elif p[0] == "warrior":
c = Warrior.new(p[1], int(p[2]), int(p[3]))
else:
c = Character.new(p[1], int(p[2]))
print(c.describe())
print("Attack: %d" % c.attack())
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