Menu
CoddyTech

在线学习平台

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

challenge icon

挑战

困难

构建一个在线学习平台中的类:课程、学生和教师。学生和教师都属于人员,因此它们共享一个父类。

这些对象不能相互指向:课程保存学生的邮箱和教师的姓名,学生和教师则保存课程的标题。需要使用课程的方法会将课程作为参数接收。

person.gd 中的 Person:构造函数接收 person_name 和 email 并保存它们。_to_string() 返回 NAME (EMAIL)。

course.gd 中的 Course:

  • 属性:title、max_capacity、instructor_name(初始值为 ""),以及 Array[String] 类型的 student_emails 和 completed_emails。
  • 构造函数接收标题和容量,容量默认为 30。
  • 信号 course_full(title: String):当 add_student() 占用最后一个空位时发出。
  • add_student(email) -> bool:课程已满或该邮箱对应的学生已在课程中时返回 false;否则添加该邮箱并返回 true。
  • remove_student(email) -> bool:移除当前学生;如果该邮箱不属于当前学生,则返回 false。
  • mark_completed(email) -> bool:将当前学生移至 completed_emails;如果该邮箱不属于当前学生,则返回 false。
  • assign_instructor(instructor) -> bool:保存教师的姓名;如果课程已经有教师,则返回 false。
  • _to_string() 返回 TITLE: N/CAPACITY students, M completed, instructor: NAME;没有教师时使用 none。

student.gd 中的 Student 继承 Person,并保留其构造函数。它有两个保存标题的 Array[String]:enrolled 和 completed:

  • enroll(course: Course) -> bool:如果课程已在 enrolled 或 completed 中,或者 course.add_student() 拒绝添加,则返回 false;否则添加标题并返回 true。
  • unenroll(course: Course) -> bool:仅适用于已注册的课程;从课程中移除该学生,并从 enrolled 中移除标题。
  • complete_course(course: Course) -> bool:仅适用于已注册的课程;调用 course.mark_completed(),并将标题从 enrolled 移至 completed。
  • _to_string() 返回 Student 、Person 的文本,以及 : N enrolled, M completed。

instructor.gd 中的 Instructor 继承 Person。它的构造函数接收 person_name、email 和 expertise,并保存一个 Array[String] 类型的 course_titles:

  • assign_to_course(course: Course) -> bool:使用自己的姓名调用 course.assign_instructor();成功后添加标题并返回 true。
  • _to_string() 返回 Instructor 、Person 的文本、, EXPERTISE: ,以及用 , 连接的标题;如果没有课程,则返回 no courses。

提供的代码会读取字段以 | 分隔的命令,并连接到 course_full,以打印 Course full: TITLE。对于以下输入:

course Python 101|2
course Data Science
student Ana|ana@mail.com
student Ben|ben@mail.com
instructor Grace Hopper|grace@mail.com|Compilers
enroll ana@mail.com|Python 101
enroll ben@mail.com|Python 101
enroll ben@mail.com|Data Science
assign grace@mail.com|Python 101
report

输出为:

Enroll Ana in Python 101: true
Course full: Python 101
Enroll Ben in Python 101: true
Enroll Ben in Data Science: true
Assign Grace Hopper to Python 101: true
Python 101: 2/2 students, 0 completed, instructor: Grace Hopper
Data Science: 1/30 students, 0 completed, instructor: none
Student Ana (ana@mail.com): 1 enrolled, 0 completed
Student Ben (ben@mail.com): 2 enrolled, 0 completed
Instructor Grace Hopper (grace@mail.com), Compilers: Python 101

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

亲手试试

extends Node

func _ready():
	# 提供的输入/输出代码:保持原样。

	var courses := {}
	var people := {}

	var line := OS.read_string_from_stdin()
	while line != "":
		var parts := line.split(" ", true, 1)
		var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
		match parts[0]:
			"course":
				var course: Course
				if f.size() > 1:
					course = Course.new(f[0], int(f[1]))
				else:
					course = Course.new(f[0])
				course.course_full.connect(func(title): print("Course full: ", title))
				courses[f[0]] = course
			"student":
				people[f[1]] = Student.new(f[0], f[1])
			"instructor":
				people[f[1]] = Instructor.new(f[0], f[1], f[2])
			"enroll":
				var ok: bool = people[f[0]].enroll(courses[f[1]])
				print("Enroll ", people[f[0]].person_name, " in ", f[1], ": ", ok)
			"unenroll":
				var ok: bool = people[f[0]].unenroll(courses[f[1]])
				print("Unenroll ", people[f[0]].person_name, " from ", f[1], ": ", ok)
			"complete":
				var ok: bool = people[f[0]].complete_course(courses[f[1]])
				print(people[f[0]].person_name, " completes ", f[1], ": ", ok)
			"assign":
				var ok: bool = people[f[0]].assign_to_course(courses[f[1]])
				print("Assign ", people[f[0]].person_name, " to ", f[1], ": ", ok)
			"report":
				for title in courses:
					print(courses[title])
				for email in people:
					print(people[email])

		line = OS.read_string_from_stdin()

面向对象编程中的所有课

自己练习: GDScript 在线编译器