Menu
CoddyTech

类与对象

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

类和它的对象各自保存不同的内容。类中的 const 属于类本身:它只有一个值,你可以通过类名读取它,无需创建对象。

# dog.gd
class_name Dog
extends RefCounted

const SPECIES = "Canis familiaris"
var dog_name: String = "Unnamed"
var breed: String = "Unknown"
print(Dog.SPECIES) # Canis familiaris

var 行描述了每个对象包含的内容。每个使用 new() 创建的对象都会获得这些变量各自的副本,并从默认值开始:

var dog1 := Dog.new()
var dog2 := Dog.new()
dog1.dog_name = "Nicky"
dog1.breed = "Husky"
print(dog1.dog_name) # Nicky
print(dog2.dog_name) # Unnamed

更改 dog1 不会改变 dog2。对象也可以读取这个常量:dog1.SPECIES 的值与 Dog.SPECIES 相同。

对象只能有其类中声明的变量。dog1.color = "brown"会导致程序因错误而停止,因为Dog没有color变量。对象需要的每个变量都要放在类中。

challenge icon

挑战

简单

在 student.gd 中完成 Student 类:

  • 创建一个常量 SCHOOL,值为 "Godot High School",由整个类共享
  • 创建一个 String 变量 student_name
  • 创建一个 String 变量 grade,初始值为 "N/A"

提供的代码会读取后续学生的人数,然后为每位学生读取一行:一个姓名,后面可选地跟着一个空格和一个成绩。它会为每行创建一个 Student,设置姓名,并且仅当该行包含成绩时才设置成绩。然后,它会输出 Student.SCHOOL 和每位学生。对于输入行 Alice A 和 Bob,输出为:

School: Godot High School
Alice has grade A
Bob has grade N/A

你的代码写在 student.gd 中。main.gd 包含提供的输入/输出代码,不能编辑。

亲手试试

extends Node

func _ready():
	# 提供的输入和输出代码:保持原样。
	var count := int(OS.read_string_from_stdin())
	var students: Array[Student] = []
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ", false)
		var student := Student.new()
		student.student_name = parts[0]
		if parts.size() > 1:
			student.grade = parts[1]
		students.append(student)
	print("School: %s" % Student.SCHOOL)
	for student in students:
		print("%s has grade %s" % [student.student_name, student.grade])
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: GDScript 在线编译器