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.
Wyzwanie
ŁatwyGaraż 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 klasieVehicle. Zwraca onaBRAND: N wheels, SOUND, wywołując funkcjewheels()isound(). - Klasa
Carnadpisuje funkcjęwheels(), zwracając4, a funkcjęsound(), zwracającVroom. - Klasa
Motorcyclenadpisuje te funkcje, zwracając odpowiednio2iBrrm. - Klasa
Truckjuż przechowuje liczbętrailers. Nadpisuje funkcjęwheels(), zwracając6plus4za każdą przyczepę, a funkcjęsound(), zwracającHonk.
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: 18Twó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)
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator GDScript online