super 关键字
本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 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要调用另一个父类方法,请在点号后写上它的名称:在 Dog 的任何方法中都可以使用 super.describe()。
挑战
简单编写一个 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())
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: GDScript 在线编译器