Menu
CoddyTech

Переопределение методов: повторение

Часть раздела Объектно-ориентированное программирование путешествия по 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: должна увеличиваться с каждым новым классом. При переопределении каждый класс содержит собственное поведение, а код, который его вызывает, остаётся неизменным.

challenge icon

Задание

Легко

Гараж обрабатывает каждое транспортное средство с помощью одного 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)
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript