Nền tảng học trực tuyến
Thuộc phần Lập trình hướng đối tượng trong hành trình GDScript của Coddy. Bài học 62 trên 65.
Thử thách
KhóXây dựng các lớp cho một nền tảng học trực tuyến: khóa học, học viên và giảng viên. Học viên và giảng viên đều là người, vì vậy họ dùng chung một lớp cha.
Các đối tượng không được tham chiếu đến nhau: một khóa học lưu email của học viên và tên của giảng viên, còn học viên và giảng viên lưu tiêu đề khóa học. Phương thức nào cần một khóa học thì nhận khóa học đó làm đối số.
Person trong person.gd: hàm khởi tạo nhận person_name và email, rồi lưu chúng. _to_string() trả về NAME (EMAIL).
Course trong course.gd:
- Thuộc tính:
title,max_capacity,instructor_name(ban đầu là""), cùng hai mảngArray[String]student_emailsvàcompleted_emails. - Hàm khởi tạo nhận tiêu đề và sức chứa, mặc định là
30. - Tín hiệu
course_full(title: String), doadd_student()phát ra khi học viên chiếm chỗ trống cuối cùng. add_student(email) -> bool: trả vềfalsekhi khóa học đã đủ chỗ hoặc email đã thuộc về một học viên; nếu không thì thêm email và trả vềtrue.remove_student(email) -> bool: xóa một học viên hiện tại, trả vềfalsenếu email không thuộc về học viên nào.mark_completed(email) -> bool: chuyển một học viên hiện tại vàocompleted_emails, trả vềfalsenếu email không thuộc về học viên hiện tại.assign_instructor(instructor) -> bool: lưu tên giảng viên, hoặc trả vềfalsenếu khóa học đã có giảng viên._to_string()trả vềTITLE: N/CAPACITY students, M completed, instructor: NAME, dùngnonenếu không có giảng viên.
Student trong student.gd kế thừa Person và giữ nguyên hàm khởi tạo. Lớp này có hai mảng tiêu đề Array[String], enrolled và completed:
enroll(course: Course) -> bool: trả vềfalsenếu khóa học đã có trongenrolledhoặccompleted, hoặc nếucourse.add_student()từ chối; nếu không thì thêm tiêu đề và trả vềtrue.unenroll(course: Course) -> bool: chỉ áp dụng với khóa học đã đăng ký; xóa học viên khỏi khóa học và xóa tiêu đề khỏienrolled.complete_course(course: Course) -> bool: chỉ áp dụng với khóa học đã đăng ký; gọicourse.mark_completed()và chuyển tiêu đề từenrolledsangcompleted._to_string()trả vềStudent, văn bản củaPerson, rồi đến: N enrolled, M completed.
Instructor trong instructor.gd kế thừa Person. Hàm khởi tạo nhận person_name, email và expertise, đồng thời lớp này lưu một mảng Array[String] course_titles:
assign_to_course(course: Course) -> bool: gọicourse.assign_instructor()với tên của mình; nếu thành công thì thêm tiêu đề và trả vềtrue._to_string()trả vềInstructor, văn bản củaPerson,, EXPERTISE:và các tiêu đề được nối bằng,, hoặcno courses.
Code được cung cấp đọc các lệnh có các trường phân tách bằng | và kết nối với course_full để in ra Course full: TITLE. Với đầu vào sau:
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đầu ra là:
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Đặt code của bạn trong person.gd, course.gd, student.gd và instructor.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.
Tự làm thử
extends Node
func _ready():
# Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
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()
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa selfPhương thứcThuộc tínhHàm khởi tạo (_init)Ôn tập: máy tính đơn giản4Tính đa hình
Xem lại cách ghi đè phương thứcĐịnh kiểu vịtLớp và phương thức trừu tượngThiết kế interfaceÔn tập: máy tính hình học7Tín hiệu
Tín hiệu là gì?Khai báo và phát tín hiệuKết nối với tín hiệuTín hiệu có đối sốÔn tập: hệ thống sức khỏe10Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổng hợp2Thuộc tính của lớp
Biến instance và biến staticHàm staticPhương thức thiết lập thuộc tínhPhương thức lấy thuộc tínhQuy ước về tính riêng tưÔn tập: trình quản lý tài khoản ngân hàng5Tính đóng gói
Thành viên công khai và riêng tưXác thực bằng phương thức setterẨn thông tinThuộc tính chỉ đọcÔn tập: hệ thống hồ sơ học sinh8Khái niệm OOP nâng cao
Kết hợp và kế thừaLớp bên trongNode dưới dạng thành phầnRefCounted và NodeEnum trong lớp3Kế thừa
Kế thừa cơ bảnTừ khóa superGhi đè phương thứcChuỗi kế thừaKiểm tra kiểu bằng isTổng kết: phân cấp nhân viên6Phương thức đặc biệt
Giới thiệu về phương thức ảoPhương thức _to_stringTrình lặp tùy chỉnhÔn tập: danh sách tùy chỉnh12Thử thách cuối cùng
Nền tảng học trực tuyếnHệ thống ngân hàngPhát triển nhân vật trò chơiDịch vụ cho thuê phương tiệnTự luyện tập: Trình biên dịch GDScript online