Menu
CoddyTech

基本继承

本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 15 课,共 65 课。

继承让一个类获得另一个类的变量和方法。传递这些内容的类是父类,接收这些内容的类是子类。

这是一个单独存放在文件中的父类:

# animal.gd
class_name Animal
extends RefCounted

var animal_name: String

func _init(n: String) -> void:
	animal_name = n

func info() -> void:
	print("I am ", animal_name, ", an animal")

子类在 extends 后写出父类的名称。父类的 class_name 是全局的,因此 dog.gd 不需要导入行:

# dog.gd
class_name Dog
extends Animal

这个 Dog 没有自己的代码,但它有 animal_name、info() 和 Animal 的构造函数:

var creature := Animal.new("Creature")
var buddy := Dog.new("Buddy")
creature.info()
buddy.info()
I am Creature, an animal
I am Buddy, an animal

子类可以在继承的方法旁边添加自己的方法。在这些方法中,继承的变量可以像子类自行声明的一样使用:

# dog.gd
class_name Dog
extends Animal

func bark() -> void:
	print(animal_name, " says Woof!")
var buddy := Dog.new("Buddy")
buddy.info()
buddy.bark()
I am Buddy, an animal
Buddy says Woof!

继承是单向的。Animal 不会获得 Dog 新增的内容,因此对 Animal 对象调用 bark() 会出错。

到目前为止,你编写的类都写了 extends RefCounted:它们是 RefCounted 的子类,RefCounted 是 Godot 内置的类。

challenge icon

挑战

简单

创建一个父类和一个子类。

  • 在 vehicle.gd 中,为 Vehicle 添加两个 String 类型的变量:brand 和 model。构造函数将两个参数分别存入这两个变量,info() 返回 Vehicle: BRAND MODEL。
  • car.gd 中已经写好了 extends Vehicle。编写它的 honk() 方法:使用 Car 继承的变量,返回 BRAND MODEL says Beep beep!。

Car 不需要构造函数:Car.new("Honda", "Civic") 会使用 Vehicle 中的构造函数。

提供的代码会先读取后续车辆的数量,然后每辆车读取一行:vehicle 或 car、一个品牌和一个型号。它会为每辆车打印 info(),并为汽车打印 honk()。对于 vehicle Toyota Corolla 和 car Honda Civic,输出如下:

Vehicle: Toyota Corolla
Vehicle: Honda Civic
Honda Civic says Beep beep!

你的代码要写在 vehicle.gd 和 car.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] == "car":
			var car := Car.new(parts[1], parts[2])
			print(car.info())
			print(car.honk())
		else:
			var vehicle := Vehicle.new(parts[1], parts[2])
			print(vehicle.info())
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: GDScript 在线编译器