Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Eine Werkstatt verwaltet jedes Fahrzeug mit einem einzigen Array[Vehicle]. In vehicle.gd gibt wheels() 0 und sound() ... zurück.

  • Schreibe describe() in Vehicle. Die Funktion gibt BRAND: N wheels, SOUND zurück, indem sie wheels() und sound() aufruft.
  • Car überschreibt wheels() mit 4 und sound() mit Vroom.
  • Motorcycle überschreibt sie mit 2 und Brrm.
  • Truck speichert bereits seine Anzahl an trailers. Es überschreibt wheels() mit 6 plus 4 pro Anhänger und sound() mit Honk.

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: 18

Dein 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)
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler