Конструктор (_init)
Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 7 из 65.
Настройка каждого свойства после new() занимает несколько строк, и легко забыть какое-нибудь из них. Конструктор настраивает объект в момент его создания. В GDScript конструктор — это метод _init():
# book.gd
class_name Book
extends RefCounted
var title: String
var author: String
var pages: int
func _init(book_title: String, book_author: String, page_count: int) -> void:
title = book_title
author = book_author
pages = page_countАргументы, которые вы передаёте в new(), передаются в _init(), которая автоматически запускается до того, как new() возвращает объект:
var dune := Book.new("Dune", "Frank Herbert", 412)
print(dune.title) # Dune
print(dune.pages) # 412Если у _init() есть параметры, new() должен передать их: вызов Book.new() без аргументов вызовет ошибку до запуска программы. Параметр со значением по умолчанию необязателен:
func _init(book_title: String, book_author: String = "Unknown") -> void:С помощью этого конструктора Book.new("Notes") создаёт книгу, автором которой является "Unknown".
Имена параметров выше отличаются от имён свойств. Если бы они совпадали, ты написал бы self.title = title, как в уроке о self.
Задание
ЛегкоЗаверши класс Book в book.gd:
- конструктор
_init(book_title, book_author, page_count)сохраняет свои аргументы в свойствахtitle,authorиpages describe()возвращает'TITLE' by AUTHOR, PAGES pages, заключая название в одинарные кавычки
Предоставленный код считывает количество следующих книг, а затем по одной строке для каждой книги, где название, автор и количество страниц разделены символом ;. Он создаёт каждую книгу с помощью Book.new(), выводит describe(), а в конце выводит сумму значений свойств pages. Для строки Dune;Frank Herbert;412 выводится:
'Dune' by Frank Herbert, 412 pages
Total pages: 412Твой код нужно поместить в book.gd. В main.gd находится предоставленный код ввода/вывода, который нельзя редактировать.
Попробуйте сами
extends Node
func _ready():
# Предоставленный код ввода-вывода: оставьте его без изменений
var count := int(OS.read_string_from_stdin())
var total := 0
for i in count:
var parts := OS.read_string_from_stdin().split(";")
var book := Book.new(parts[0], parts[1], int(parts[2]))
print(book.describe())
total += book.pages
print("Total pages: %d" % total)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript