Menu
CoddyTech

Ponowne omówienie przesłaniania metod

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 21 z 65.

Polimorfizm oznacza „wiele form”: to samo wywołanie metody wykonuje różne działania w zależności od klasy obiektu, który je otrzymuje. To nadpisywanie sprawia, że jest to możliwe.

# 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!"

Tablica Array[Animal] może przechowywać je wszystkie. Pętla wywołuje speak(), nie wiedząc, jaką klasę ma każdy element, a każdy obiekt odpowiada własną wersją:

var animals: Array[Animal] = [Dog.new(), Cat.new(), Animal.new()]
for animal in animals:
	print(animal.speak())
Woof!
Meow!
...

Funkcja z parametrem typu Animal działa tak samo. Przyjmuje każdą klasę potomną, w tym klasy dodane później, bez konieczności wprowadzania zmian:

func make_it_speak(animal: Animal) -> void:
	print("It says ", animal.speak())
make_it_speak(Cat.new())
It says Meow!

Porównaj to ze sprawdzaniem klas po kolei. Łańcuch gałęzi if animal is Dog: musi się rozrastać wraz z każdą nową klasą. Dzięki nadpisywaniu każda klasa ma własne zachowanie, a kod, który je wywołuje, pozostaje taki sam.

challenge icon

Wyzwanie

Łatwy

Garaż obsługuje każdy pojazd za pomocą jednej Array[Vehicle]. W pliku vehicle.gd funkcja wheels() zwraca 0, a funkcja sound() zwraca ....

  • Napisz funkcję describe() w klasie Vehicle. Zwraca ona BRAND: N wheels, SOUND, wywołując funkcje wheels() i sound().
  • Klasa Car nadpisuje funkcję wheels(), zwracając 4, a funkcję sound(), zwracając Vroom.
  • Klasa Motorcycle nadpisuje te funkcje, zwracając odpowiednio 2 i Brrm.
  • Klasa Truck już przechowuje liczbę trailers. Nadpisuje funkcję wheels(), zwracając 6 plus 4 za każdą przyczepę, a funkcję sound(), zwracając Honk.

Klasy potomne nie nadpisują funkcji describe(). Dostarczony kod odczytuje liczbę kolejnych pojazdów, a następnie po jednym wierszu na pojazd: car BRAND, motorcycle BRAND, truck BRAND TRAILERS lub vehicle BRAND. Wypisuje wynik każdej funkcji describe() oraz sumę wartości zwracanych przez wheels(). Dla car Toyota i truck Volvo 2 wypisuje:

Toyota: 4 wheels, Vroom
Volvo: 14 wheels, Honk
Total wheels: 18

Twój kod umieść w plikach vehicle.gd, car.gd, motorcycle.gd i truck.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
	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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online