Menu
CoddyTech

Конструктор (_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.

challenge icon

Задание

Легко

Заверши класс 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)
quiz iconПроверьте себя

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

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

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