Menu
CoddyTech

构造函数(_init)

本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 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 的那一课中一样写 self.title = title。

challenge icon

挑战

简单

在 book.gd 中完成 Book 类:

  • 构造函数 _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 在线编译器