Menu
CoddyTech

面向对象编程简介

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

面向对象编程(OOP)围绕对象组织程序。对象将数据(变量)与处理这些数据的函数打包在一起。类描述了它的对象包含什么以及能做什么,你可以根据需要创建任意多个对象。

在 GDScript 中,每个脚本文件都是一个类。使用 class_name 为它命名,并声明每个对象持有的变量:

# car.gd
class_name Car
extends RefCounted

var brand: String = "Generic"
var wheels: int = 4

extends RefCounted 会在没有变量再引用 Car 对象时,让 Godot 自动释放它。对于所有保存数据且不是节点的类,都要使用它。没有 extends 行的脚本也会继承 RefCounted。

在类上调用 new() 来创建对象,然后用点号访问它的变量:

# main.gd
var my_car := Car.new()
print(my_car.wheels) # 4
print(my_car is Car) # true

is 运算符会检查对象是由哪个类创建的。直接输出对象本身只会显示类似 <RefCounted#-9223372009860233781> 这样的 ID,因此要改为输出它的变量。

类是蓝图,每个对象都是根据它创建的独立事物:调用两次 Car.new() 会得到两辆车。

challenge icon

挑战

简单

在 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)
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: GDScript 在线编译器