图书和用户类
本课属于 Coddy GDScript 学习旅程的“面向对象编程”单元。第 57 课,共 65 课。
挑战
简单添加 Book 和 User 类,每个类都放在单独的文件中,并让图书馆存储这些对象。保留你在上一步中编写的所有内容。
Book 位于 book.gd 中:
- 构造函数接收
title、author和isbn(类型都是String),并将它们存储在同名属性中。 available初始值为true,borrower_id初始值为""。_to_string()返回TITLE by AUTHOR (ISBN: ISBN) - Available,当available为false时,末尾改为Not Available。
User 位于 user.gd 中:
- 构造函数接收
user_id和user_name,并将它们存储起来。 borrowed_isbns是一个初始为空的Array[String]。_to_string()返回User: NAME (ID: ID) - Books borrowed: N,其中N是borrowed_isbns的大小。
在 library.gd 中,将 books 改为 Array[Book],将 users 改为 Array[User],并添加方法 add_book(book: Book) 和 add_user(user: User),将对应对象追加到数组中。
图书通过用户的 id 记录借阅者,用户则通过图书的 ISBN 记录借阅的图书。如果图书存储 User 对象,而用户存储 Book 对象,它们就会互相保持存活,程序结束时 Godot 会报告它们发生了内存泄漏。
main.gd 中提供的代码已更改:字段现在用 | 分隔。命令包括 book TITLE|AUTHOR|ISBN、user ID|NAME、lend ISBN|ID(它会直接设置图书和用户的属性)、books 和 users(打印每本图书或每位用户),以及 show。对于以下输入:
Riverside
book Dune|Frank Herbert|111
user U001|Alice
user U002|Bob
lend 111|U002
books
users
show输出为:
Dune by Frank Herbert (ISBN: 111) - Not Available
User: Alice (ID: U001) - Books borrowed: 0
User: Bob (ID: U002) - Books borrowed: 1
Riverside Library (books: 1, users: 2)你的代码应写在 book.gd、user.gd 和 library.gd 中。main.gd 包含提供的输入/输出代码,不能编辑。
亲手试试
extends Node
func _ready():
# 提供的输入/输出代码:保持原样
var library := Library.new(OS.read_string_from_stdin())
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var fields: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"book":
library.add_book(Book.new(fields[0], fields[1], fields[2]))
"user":
library.add_user(User.new(fields[0], fields[1]))
"lend":
for book in library.books:
if book.isbn == fields[0]:
book.available = false
book.borrower_id = fields[1]
for user in library.users:
if user.user_id == fields[1]:
user.borrowed_isbns.append(fields[0])
"books":
for book in library.books:
print(book)
"users":
for user in library.users:
print(user)
"show":
print(library)
line = OS.read_string_from_stdin()
面向对象编程中的所有课
自己练习: GDScript 在线编译器