Menu
CoddyTech

图书和用户类

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

challenge icon

挑战

简单

添加 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 在线编译器