Переопределение методов: повторение
Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 21 из 65.
Полиморфизм означает «много форм»: один вызов метода выполняет разные действия в зависимости от класса объекта, который его получает. Переопределение позволяет это реализовать.
# animal.gd
class_name Animal
extends RefCounted
func speak() -> String:
return "..."# dog.gd
class_name Dog
extends Animal
func speak() -> String:
return "Woof!"# cat.gd
class_name Cat
extends Animal
func speak() -> String:
return "Meow!"Array[Animal] может хранить их всех. Цикл вызывает speak(), не зная, к какому классу относится каждый элемент, и каждый объект отвечает своей версией:
var animals: Array[Animal] = [Dog.new(), Cat.new(), Animal.new()]
for animal in animals:
print(animal.speak())Woof!
Meow!
...Функция с параметром Animal работает так же. Она принимает любой дочерний класс, в том числе классы, которые вы добавите позже, без изменений:
func make_it_speak(animal: Animal) -> void:
print("It says ", animal.speak())make_it_speak(Cat.new())It says Meow!Сравни это с проверкой классов по одному. Цепочка ветвей if animal is Dog: должна увеличиваться с каждым новым классом. При переопределении каждый класс содержит собственное поведение, а код, который его вызывает, остаётся неизменным.
Задание
ЛегкоГараж обрабатывает каждое транспортное средство с помощью одного Array[Vehicle]. В vehicle.gd метод wheels() возвращает 0, а sound() возвращает ....
- Напиши
describe()вVehicle. Он возвращаетBRAND: N wheels, SOUND, вызываяwheels()иsound(). Carпереопределяетwheels(), возвращая4, аsound()— возвращаяVroom.Motorcycleпереопределяет их, возвращая2иBrrm.Truckуже хранит числоtrailers. Он переопределяетwheels(), возвращая6плюс4за каждый прицеп, аsound()— возвращаяHonk.
Дочерние классы не переопределяют describe(). Предоставленный код считывает количество следующих транспортных средств, а затем по одной строке на каждое: car BRAND, motorcycle BRAND, truck BRAND TRAILERS или vehicle BRAND. Он выводит результат каждого вызова describe() и общее количество колёс из wheels(). Для car Toyota и truck Volvo 2 он выводит:
Toyota: 4 wheels, Vroom
Volvo: 14 wheels, Honk
Total wheels: 18Твой код нужно написать в файлах vehicle.gd, car.gd, motorcycle.gd и truck.gd. В main.gd находится предоставленный код ввода/вывода, который нельзя редактировать.
Попробуйте сами
extends Node
func _ready():
# Предоставленный код ввода-вывода: оставьте его без изменений
var count := int(OS.read_string_from_stdin())
var vehicles: Array[Vehicle] = []
for i in count:
var p := OS.read_string_from_stdin().split(" ")
if p[0] == "car":
vehicles.append(Car.new(p[1]))
elif p[0] == "motorcycle":
vehicles.append(Motorcycle.new(p[1]))
elif p[0] == "truck":
vehicles.append(Truck.new(p[1], int(p[2])))
else:
vehicles.append(Vehicle.new(p[1]))
var total := 0
for v in vehicles:
print(v.describe())
total += v.wheels()
print("Total wheels: %d" % total)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript