Łańcuchy dziedziczenia
Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 18 z 65.
Klasa potomna sama może być klasą nadrzędną. Każde extends dodaje jeden poziom do łańcucha dziedziczenia:
# vehicle.gd
class_name Vehicle
extends RefCounted
var wheels: int
func _init(w: int) -> void:
wheels = w
func describe() -> String:
return "%d wheels" % wheels# car.gd
class_name Car
extends Vehicle
func _init() -> void:
super(4)
func describe() -> String:
return "Car with " + super()# race_car.gd
class_name RaceCar
extends Car
var top_speed: int
func _init(speed: int) -> void:
super()
top_speed = speed
func describe() -> String:
return super() + ", top speed %d" % top_speedRaceCar ma wszystko z Car i Vehicle. Każde wywołanie super() przechodzi o jeden poziom wyżej, więc jedno wywołanie uruchamia wszystkie trzy wersje describe():
print(RaceCar.new(300).describe())Car with 4 wheels, top speed 300Gdy wywołujesz metodę lub odczytujesz zmienną, Godot najpierw szuka w klasie danego obiektu, potem w jego klasie nadrzędnej, a następnie w klasie nadrzędnej tej klasy i używa pierwszego znalezionego elementu. RaceCar.new(300).wheels znajduje się w klasie Vehicle, dwa poziomy wyżej.
Każda klasa ma dokładnie jedną klasę nadrzędną. extends przyjmuje jedną klasę, a podanie dwóch powoduje błąd analizy składniowej:
class_name FlyingCar
extends Car, PlaneParse Error: Expected end of statement after superclass, found "," instead.GDScript nie obsługuje wielokrotnego dziedziczenia. Gdy klasa potrzebuje funkcji dwóch klas, umieść je w jednym łańcuchu albo przekaż jej obiekt drugiej klasy, z którym będzie mogła współpracować (omówimy to w późniejszym rozdziale).
Wyzwanie
Łatwycharacter.gd zawiera gotową klasę Character: nazwę, hp, describe() zwracającą NAME (HP HP) oraz attack() zwracającą 1. Zbuduj na niej jeszcze dwa poziomy:
Warriordziedziczy poCharacteri dodajestrength. Jego konstruktor przekazuje nazwę i hp dosuper().describe()dodaje, strength Sdo tekstu klasy nadrzędnej, aattack()zwraca siłę.Knightdziedziczy poWarriori dodajearmor. Jego konstruktor przekazuje nazwę, hp i siłę dosuper().describe()dodaje, armor Ado tekstu klasyWarrior, aattack()zwraca wynik ataku klasyWarriorpowiększony o5.
Dostarczony kod odczytuje liczbę kolejnych postaci, a następnie po jednym wierszu na postać: character NAME HP, warrior NAME HP STRENGTH lub knight NAME HP STRENGTH ARMOR. Wypisuje wynik describe() i atak. Dla knight Arthur 120 15 8 wypisuje:
Arthur (120 HP), strength 15, armor 8
Attack: 20Twój kod umieść w plikach warrior.gd i knight.gd. 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())
for i in count:
var p := OS.read_string_from_stdin().split(" ")
var c: Character
if p[0] == "knight":
c = Knight.new(p[1], int(p[2]), int(p[3]), int(p[4]))
elif p[0] == "warrior":
c = Warrior.new(p[1], int(p[2]), int(p[3]))
else:
c = Character.new(p[1], int(p[2]))
print(c.describe())
print("Attack: %d" % c.attack())
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