在线学习平台
本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 62 课,共 65 课。
挑战
困难构建一个在线学习平台中的类:课程、学生和教师。学生和教师都属于人员,因此它们共享一个父类。
这些对象不能相互指向:课程保存学生的邮箱和教师的姓名,学生和教师则保存课程的标题。需要使用课程的方法会将课程作为参数接收。
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 在线编译器