Menu
CoddyTech

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 " + breed
var rex := Dog.new("Rex", "Husky")
print(rex.describe())
Animal created: Rex
Dog breed set: Husky
I am Rex, a Husky

要调用另一个父类方法,请在点号后写上它的名称:在 Dog 的任何方法中都可以使用 super.describe()。

challenge icon

挑战

简单

编写一个 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())
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: GDScript 在线编译器