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 BuddyNadpisana 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 MeowZmiennych 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().
Wyzwanie
Łatwyshape.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()zwracaPI * radius * radius, adescribe()zwracaThis is a COLOR circle with radius R.Square:area()zwracaside * side, adescribe()zwracaThis 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.00Umieść 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())
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