Переопределение методов
Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 17 из 65.
Дочерний класс переопределяет метод, определяя метод с таким же именем. Объекты дочернего класса выполняют версию метода из дочернего класса, а методы, которые он не переопределяет, по-прежнему наследуются без изменений.
# 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Переопределение должно сохранять сигнатуру родительского метода: те же параметры и тот же тип возвращаемого значения. Если сигнатура отличается, программа не запускается:
# 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".Версия дочернего класса выполняется, даже когда вызов идёт из метода родительского класса. Здесь introduce() существует только в Animal и вызывает sound(), который переопределён в 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Переменные нельзя переопределять: повторное объявление var animal_name в Dog приводит к ошибке разбора (The member "animal_name" already exists in parent class Animal). Чтобы задать дочернему классу другое начальное значение, присвойте его в _init() дочернего класса.
Задание
Легкоshape.gd содержит готовый класс Shape: color, area(), возвращающий 0.0, и describe(). Классы Circle и Square наследуются от него, и их конструкторы уже написаны. Переопредели в каждом из них два метода:
Circle:area()возвращаетPI * radius * radius, аdescribe()возвращаетThis is a COLOR circle with radius R.Square:area()возвращаетside * side, аdescribe()возвращаетThis is a COLOR square with side S.
Сохрани сигнатуры родительского класса: func area() -> float и func describe() -> String.
Предоставленный код считывает количество фигур, а затем по одной строке для каждой фигуры: shape COLOR, circle COLOR RADIUS или square COLOR SIDE. Он выводит describe() и площадь с точностью до двух десятичных знаков. Для circle red 5 и shape green он выводит:
This is a red circle with radius 5
Area: 78.54
This is a green shape
Area: 0.00Твой код нужно написать в circle.gd и square.gd. В main.gd находится предоставленный код ввода/вывода, его нельзя редактировать.
Попробуйте сами
extends Node
func _ready():
# Предоставленный код ввода/вывода: оставьте его без изменений
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())
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript