面向对象编程简介
本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 2 课,共 65 课。
面向对象编程(OOP)围绕对象组织程序。对象将数据(变量)与处理这些数据的函数打包在一起。类描述了它的对象包含什么以及能做什么,你可以根据需要创建任意多个对象。
在 GDScript 中,每个脚本文件都是一个类。使用 class_name 为它命名,并声明每个对象持有的变量:
# car.gd
class_name Car
extends RefCounted
var brand: String = "Generic"
var wheels: int = 4extends RefCounted 会在没有变量再引用 Car 对象时,让 Godot 自动释放它。对于所有保存数据且不是节点的类,都要使用它。没有 extends 行的脚本也会继承 RefCounted。
在类上调用 new() 来创建对象,然后用点号访问它的变量:
# main.gd
var my_car := Car.new()
print(my_car.wheels) # 4
print(my_car is Car) # trueis 运算符会检查对象是由哪个类创建的。直接输出对象本身只会显示类似 <RefCounted#-9223372009860233781> 这样的 ID,因此要改为输出它的变量。
类是蓝图,每个对象都是根据它创建的独立事物:调用两次 Car.new() 会得到两辆车。
挑战
简单在 car.gd 中创建类 Car:
- 类名为
Car,并且继承RefCounted - 创建一个
String类型的变量brand,初始值为"Generic" - 创建一个
int类型的变量wheels,初始值为4
提供的代码会读取要创建的汽车数量,并使用 Car.new() 创建每辆汽车。它会输出汽车数量和车轮总数。如果至少创建了一辆汽车,它会读取第一辆汽车的品牌,并输出第一辆和最后一辆汽车的品牌。输入 3 和 Tesla 时,输出为:
Cars: 3
Wheels: 12
First car: Tesla
Last car: Generic你的代码写在 car.gd 中。main.gd 包含提供的输入/输出代码,不能编辑。
亲手试试
extends Node
func _ready():
# 提供的输入输出代码:保持原样。
var count := int(OS.read_string_from_stdin())
var garage: Array[Car] = []
for i in count:
garage.append(Car.new())
var total := 0
for car in garage:
total += car.wheels
print("Cars: %d" % garage.size())
print("Wheels: %d" % total)
if count > 0:
garage[0].brand = OS.read_string_from_stdin()
print("First car: %s" % garage[0].brand)
print("Last car: %s" % garage[-1].brand)
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: GDScript 在线编译器