Menu
CoddyTech

Nadpisywanie metod

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

Dziecko nadpisuje metodę, definiując metodę o tej samej nazwie. Obiekty klasy potomnej uruchamiają wtedy wersję z klasy potomnej, a metody, których nie nadpisuje, nadal są dziedziczone bez zmian.

# animal.gd
class_name Animal
extends RefCounted

var animal_name: String

func _init(n: String) -> void:
	animal_name = n

func make_sound() -> void:
	print("Some generic animal sound")

func info() -> void:
	print("I am ", animal_name)
# dog.gd
class_name Dog
extends Animal

func make_sound() -> void:
	print("Woof! Woof!")
var animal := Animal.new("Generic")
var dog := Dog.new("Buddy")
animal.make_sound()
dog.make_sound()
dog.info()
Some generic animal sound
Woof! Woof!
I am Buddy

Nadpisana metoda musi zachować sygnaturę metody z klasy nadrzędnej: te same parametry i ten sam typ zwracany. Jeśli będzie inna, program się nie uruchomi:

# animal.gd
func speak(times: int) -> String:
	return "...".repeat(times)
# dog.gd
func speak() -> String:
	return "Woof"
Parse Error: The function signature doesn't match the parent. Parent signature is "speak(int) -> String".

Wersja klasy potomnej jest uruchamiana nawet wtedy, gdy wywołanie pochodzi z metody klasy nadrzędnej. Tutaj introduce() istnieje tylko w klasie Animal i wywołuje sound(), którą nadpisuje klasa Cat:

# animal.gd
func sound() -> String:
	return "..."

func introduce() -> String:
	return animal_name + " says " + sound()
# cat.gd
func sound() -> String:
	return "Meow"
print(Cat.new("Tom").introduce())
Tom says Meow

Zmiennych nie można nadpisywać: ponowne zadeklarowanie var animal_name w Dog powoduje błąd parsowania (The member "animal_name" already exists in parent class Animal). Aby nadać klasie potomnej inną wartość początkową, przypisz ją w jej _init().

challenge icon

Wyzwanie

Łatwy

shape.gd zawiera ukończoną klasę Shape: pole color, metodę area() zwracającą 0.0 oraz metodę describe(). Circle i Square dziedziczą po niej i mają już konstruktory. Przesłoń po dwie metody w każdej z nich:

  • Circle: area() zwraca PI * radius * radius, a describe() zwraca This is a COLOR circle with radius R.
  • Square: area() zwraca side * side, a describe() zwraca This is a COLOR square with side S.

Zachowaj sygnatury metod z klasy bazowej: func area() -> float oraz func describe() -> String.

Dostarczony kod odczytuje liczbę kolejnych figur, a następnie po jednym wierszu dla każdej figury: shape COLOR, circle COLOR RADIUS lub square COLOR SIDE. Wypisuje wynik describe() oraz pole powierzchni z dokładnością do dwóch miejsc po przecinku. Dla circle red 5 i shape green wypisuje:

This is a red circle with radius 5
Area: 78.54
This is a green shape
Area: 0.00

Umieść swój kod w plikach circle.gd i square.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 parts := OS.read_string_from_stdin().split(" ")
		var shape: Shape
		if parts[0] == "circle":
			shape = Circle.new(parts[1], int(parts[2]))
		elif parts[0] == "square":
			shape = Square.new(parts[1], int(parts[2]))
		else:
			shape = Shape.new(parts[1])
		print(shape.describe())
		print("Area: %.2f" % shape.area())
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