基本继承
本课属于 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 内置的类。
挑战
简单创建一个父类和一个子类。
- 在
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())
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: GDScript 在线编译器