Methodenüberschreibung erneut betrachtet
Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 21 von 65.
Polymorphismus bedeutet „viele Formen“: Ein Methodenaufruf bewirkt je nach Klasse des Objekts, das ihn empfängt, unterschiedliche Dinge. Überschreiben macht dies möglich.
# animal.gd
class_name Animal
extends RefCounted
func speak() -> String:
return "..."# dog.gd
class_name Dog
extends Animal
func speak() -> String:
return "Woof!"# cat.gd
class_name Cat
extends Animal
func speak() -> String:
return "Meow!"Ein Array[Animal] kann sie alle enthalten. Die Schleife ruft speak() auf, ohne zu wissen, zu welcher Klasse jedes Element gehört, und jedes Objekt antwortet mit seiner eigenen Version:
var animals: Array[Animal] = [Dog.new(), Cat.new(), Animal.new()]
for animal in animals:
print(animal.speak())Woof!
Meow!
...Eine Funktion mit einem Animal-Parameter funktioniert genauso. Sie akzeptiert jede Unterklasse, auch Klassen, die du später hinzufügst, ohne dass eine Änderung nötig ist:
func make_it_speak(animal: Animal) -> void:
print("It says ", animal.speak())make_it_speak(Cat.new())It says Meow!Vergleiche dies damit, Klassen einzeln zu prüfen. Eine Kette von if animal is Dog:-Verzweigungen muss mit jeder neuen Klasse wachsen. Beim Überschreiben bringt jede Klasse ihr eigenes Verhalten mit, und der aufrufende Code bleibt gleich.
Aufgabe
EinfachEine Werkstatt verwaltet jedes Fahrzeug mit einem einzigen Array[Vehicle]. In vehicle.gd gibt wheels() 0 und sound() ... zurück.
- Schreibe
describe()inVehicle. Die Funktion gibtBRAND: N wheels, SOUNDzurück, indem siewheels()undsound()aufruft. Carüberschreibtwheels()mit4undsound()mitVroom.Motorcycleüberschreibt sie mit2undBrrm.Truckspeichert bereits seine Anzahl antrailers. Es überschreibtwheels()mit6plus4pro Anhänger undsound()mitHonk.
Die Unterklassen überschreiben describe() nicht. Der bereitgestellte Code liest ein, wie viele Fahrzeuge folgen, und anschließend eine Zeile pro Fahrzeug: car BRAND, motorcycle BRAND, truck BRAND TRAILERS oder vehicle BRAND. Er gibt jedes Ergebnis von describe() und die Gesamtzahl von wheels() aus. Für car Toyota und truck Volvo 2 gibt er Folgendes aus:
Toyota: 4 wheels, Vroom
Volvo: 14 wheels, Honk
Total wheels: 18Dein Code gehört in vehicle.gd, car.gd, motorcycle.gd und truck.gd. main.gd enthält den bereitgestellten Ein-/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())
var vehicles: Array[Vehicle] = []
for i in count:
var p := OS.read_string_from_stdin().split(" ")
if p[0] == "car":
vehicles.append(Car.new(p[1]))
elif p[0] == "motorcycle":
vehicles.append(Motorcycle.new(p[1]))
elif p[0] == "truck":
vehicles.append(Truck.new(p[1], int(p[2])))
else:
vehicles.append(Vehicle.new(p[1]))
var total := 0
for v in vehicles:
print(v.describe())
total += v.wheels()
print("Total wheels: %d" % total)
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