Ключевое слово 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 " + breedvar rex := Dog.new("Rex", "Husky")
print(rex.describe())Animal created: Rex
Dog breed set: Husky
I am Rex, a HuskyЧтобы вызвать другой родительский метод, напишите его имя после точки: super.describe() работает из любого метода Dog.
Задание
ЛегкоНапиши класс 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())
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript