Menu
CoddyTech

Ключевое слово super

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

Когда дочернему классу нужны дополнительные данные, он записывает собственный _init(). После этого конструктор родительского класса больше не запускается автоматически. Вызови его с помощью super(), передав аргументы, которые ожидает родительский класс:

# animal.gd
class_name Animal
extends RefCounted

var animal_name: String

func _init(n: String) -> void:
	animal_name = n
	print("Animal created: ", n)
# dog.gd
class_name Dog
extends Animal

var breed: String

func _init(n: String, b: String) -> void:
	super(n)
	breed = b
	print("Dog breed set: ", b)
var buddy := Dog.new("Buddy", "Beagle")
print(buddy.animal_name, " the ", buddy.breed)
Animal created: Buddy
Dog breed set: Beagle
Buddy the Beagle

Без строки super(n) программа всё ещё запускается, но конструктор Animal пропускается: ничто не задаёт animal_name, поэтому она остаётся пустой строкой. Сначала помести super(), чтобы переменные родительского класса были готовы до того, как дочерний класс начнёт их использовать.

В любом другом методе super() запускает родительскую версию метода, в котором вы находитесь. Дочерний класс сохраняет результат родительского и дополняет его:

# animal.gd
func describe() -> String:
	return "I am " + animal_name
# dog.gd
func describe() -> String:
	return super() + ", a " + breed
var rex := Dog.new("Rex", "Husky")
print(rex.describe())
Animal created: Rex
Dog breed set: Husky
I am Rex, a Husky

Чтобы вызвать другой родительский метод, напишите его имя после точки: super.describe() работает из любого метода Dog.

challenge icon

Задание

Легко

Напиши класс Person и класс Employee, который наследуется от него.

  • Person хранит person_name и age в своём конструкторе. introduce() возвращает Hi, I'm NAME and I'm AGE years old.
  • Employee добавляет job. Его конструктор передаёт имя и возраст в super() и сохраняет должность. Его метод introduce() возвращает результат метода introduce() родительского класса, за которым следует . I work as a JOB.

Предоставленный код считывает количество следующих людей, затем по одной строке для каждого: person NAME AGE или employee NAME AGE JOB. Для каждого он выводит introduce(). Для person Alice 30 и employee Bob 35 Developer он выводит:

Hi, I'm Alice and I'm 30 years old
Hi, I'm Bob and I'm 35 years old. I work as a Developer

Твой код нужно поместить в person.gd и employee.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] == "employee":
			var employee := Employee.new(parts[1], int(parts[2]), parts[3])
			print(employee.introduce())
		else:
			var person := Person.new(parts[1], int(parts[2]))
			print(person.introduce())
quiz iconПроверьте себя

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

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

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