Menu
CoddyTech

Основы наследования

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 15 из 65.

Наследование позволяет одному классу перенимать переменные и методы другого. Класс, который их передаёт, называется родительским, а класс, который их получает, — дочерним.

Вот родительский класс в отдельном файле:

# animal.gd
class_name Animal
extends RefCounted

var animal_name: String

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

func info() -> void:
	print("I am ", animal_name, ", an animal")

Дочерний класс указывает родительский после extends. class_name родительского класса является глобальным, поэтому в dog.gd не нужна строка импорта:

# dog.gd
class_name Dog
extends Animal

У этого Dog нет собственного кода, но у него есть animal_name, info() и конструктор Animal:

var creature := Animal.new("Creature")
var buddy := Dog.new("Buddy")
creature.info()
buddy.info()
I am Creature, an animal
I am Buddy, an animal

Дочерний класс может добавлять собственные методы наряду с унаследованными. Внутри этих методов унаследованные переменные работают так, как если бы дочерний класс объявил их:

# dog.gd
class_name Dog
extends Animal

func bark() -> void:
	print(animal_name, " says Woof!")
var buddy := Dog.new("Buddy")
buddy.info()
buddy.bark()
I am Buddy, an animal
Buddy says Woof!

Наследование работает только в одном направлении. Animal не получает того, что добавляет Dog, поэтому вызов bark() для объекта Animal — это ошибка.

В классах, которые вы написали до сих пор, было указано extends RefCounted: они были наследниками RefCounted, класса, встроенного в Godot.

challenge icon

Задание

Легко

Создай родительский и дочерний классы.

  • В vehicle.gd задай классу Vehicle две переменные типа String: brand и model. Конструктор сохраняет в них два аргумента, а info() возвращает Vehicle: BRAND MODEL.
  • В car.gd уже указано extends Vehicle. Напиши метод honk(): он возвращает BRAND MODEL says Beep beep!, используя переменные, унаследованные классом Car.

Классу Car не нужен конструктор: Car.new("Honda", "Civic") использует конструктор класса Vehicle.

Предоставленный код считывает количество следующих транспортных средств, а затем по одной строке на каждое: vehicle или car, марку и модель. Для каждого транспортного средства он выводит info(), а для автомобиля также honk(). Для vehicle Toyota Corolla и car Honda Civic он выводит:

Vehicle: Toyota Corolla
Vehicle: Honda Civic
Honda Civic says Beep beep!

Твой код нужно добавить в vehicle.gd и car.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(" ")
		if parts[0] == "car":
			var car := Car.new(parts[1], parts[2])
			print(car.info())
			print(car.honk())
		else:
			var vehicle := Vehicle.new(parts[1], parts[2])
			print(vehicle.info())
quiz iconПроверьте себя

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

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

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