Menu
CoddyTech

Ł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_speed

RaceCar 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 300

Gdy 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, Plane
Parse 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).

challenge icon

Wyzwanie

Łatwy

character.gd zawiera gotową klasę Character: nazwę, hp, describe() zwracającą NAME (HP HP) oraz attack() zwracającą 1. Zbuduj na niej jeszcze dwa poziomy:

  • Warrior dziedziczy po Character i dodaje strength. Jego konstruktor przekazuje nazwę i hp do super(). describe() dodaje , strength S do tekstu klasy nadrzędnej, a attack() zwraca siłę.
  • Knight dziedziczy po Warrior i dodaje armor. Jego konstruktor przekazuje nazwę, hp i siłę do super(). describe() dodaje , armor A do tekstu klasy Warrior, a attack() zwraca wynik ataku klasy Warrior powiększony o 5.

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

Twó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())
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