构造函数(_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。
挑战
简单在 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)
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: GDScript 在线编译器