Methodenüberschreibung
Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 17 von 65.
Ein Kind überschreibt eine Methode, indem es eine Methode mit demselben Namen definiert. Objekte der Kindklasse führen dann die Version des Kindes aus, und die Methoden, die es nicht überschreibt, werden weiterhin unverändert geerbt.
# animal.gd
class_name Animal
extends RefCounted
var animal_name: String
func _init(n: String) -> void:
animal_name = n
func make_sound() -> void:
print("Some generic animal sound")
func info() -> void:
print("I am ", animal_name)# dog.gd
class_name Dog
extends Animal
func make_sound() -> void:
print("Woof! Woof!")var animal := Animal.new("Generic")
var dog := Dog.new("Buddy")
animal.make_sound()
dog.make_sound()
dog.info()Some generic animal sound
Woof! Woof!
I am BuddyDie Überschreibung muss die Signatur der Elternklasse beibehalten: dieselben Parameter und denselben Rückgabetyp. Mit einer anderen Signatur startet das Programm nicht:
# animal.gd
func speak(times: int) -> String:
return "...".repeat(times)# dog.gd
func speak() -> String:
return "Woof"Parse Error: The function signature doesn't match the parent. Parent signature is "speak(int) -> String".Die Version des Kinds wird auch dann ausgeführt, wenn der Aufruf aus einer Methode der Elternklasse stammt. Hier existiert introduce() nur in Animal, und die Methode ruft sound() auf, das von Cat überschrieben wird:
# animal.gd
func sound() -> String:
return "..."
func introduce() -> String:
return animal_name + " says " + sound()# cat.gd
func sound() -> String:
return "Meow"print(Cat.new("Tom").introduce())Tom says MeowVariablen können nicht überschrieben werden: var animal_name erneut in Dog zu deklarieren, ist ein Parsefehler (The member "animal_name" already exists in parent class Animal). Um einem Kind einen anderen Anfangswert zu geben, weise ihn im _init() des Kindes zu.
Aufgabe
Einfachshape.gd enthält die fertige Klasse Shape: eine color, area(), die 0.0 zurückgibt, und describe(). Circle und Square erweitern sie und haben bereits ihre Konstruktoren. Überschreibe jeweils zwei Methoden:
Circle:area()gibtPI * radius * radiuszurück, unddescribe()gibtThis is a COLOR circle with radius Rzurück.Square:area()gibtside * sidezurück, unddescribe()gibtThis is a COLOR square with side Szurück.
Behalte die Signaturen der Elternklasse bei: func area() -> float und func describe() -> String.
Der bereitgestellte Code liest ein, wie viele Formen folgen, dann eine Zeile pro Form: shape COLOR, circle COLOR RADIUS oder square COLOR SIDE. Er gibt describe() und die Fläche mit zwei Dezimalstellen aus. Für circle red 5 und shape green gibt er Folgendes aus:
This is a red circle with radius 5
Area: 78.54
This is a green shape
Area: 0.00Dein Code kommt in circle.gd und square.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 count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
var shape: Shape
if parts[0] == "circle":
shape = Circle.new(parts[1], int(parts[2]))
elif parts[0] == "square":
shape = Square.new(parts[1], int(parts[2]))
else:
shape = Shape.new(parts[1])
print(shape.describe())
print("Area: %.2f" % shape.area())
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