Clases de libros y usuarios
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 57 de 65.
Desafío
FácilAñade las clases Book y User, cada una en su propio archivo, y haz que la biblioteca las almacene. Conserva todo lo que escribiste en el paso anterior.
Book en book.gd:
- El constructor recibe
title,authoreisbn(todosString) y los almacena en propiedades con los mismos nombres. availableempieza comotrueyborrower_idempieza como""._to_string()devuelveTITLE by AUTHOR (ISBN: ISBN) - Available, conNot Availableal final cuandoavailableesfalse.
User en user.gd:
- El constructor recibe
user_idyuser_namey los almacena. borrowed_isbnses unArray[String]que empieza vacío._to_string()devuelveUser: NAME (ID: ID) - Books borrowed: N, dondeNes el tamaño deborrowed_isbns.
En library.gd, cambia books por un Array[Book] y users por un Array[User], y añade los métodos add_book(book: Book) y add_user(user: User), que los agregan.
Un libro recuerda a su prestatario mediante el id del usuario, y un usuario recuerda los libros mediante su ISBN. Si el libro almacenara el objeto User y el usuario almacenara el objeto Book, ambos se mantendrían vivos mutuamente y Godot los reportaría como fugas al terminar el programa.
El código proporcionado en main.gd cambió: ahora los campos están separados por |. Los comandos son book TITLE|AUTHOR|ISBN, user ID|NAME, lend ISBN|ID (establece directamente las propiedades del libro y del usuario), books y users (imprimen cada libro o usuario), y show. Para esta entrada:
Riverside
book Dune|Frank Herbert|111
user U001|Alice
user U002|Bob
lend 111|U002
books
users
showla salida es:
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)Tu código va en book.gd, user.gd y library.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
extends Node
func _ready():
# Código de entrada/salida proporcionado: déjalo tal como está
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()
Todas las lecciones de Programación orientada a objetos
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases11Proyecto: Gestión de bibliotecas
Descripción general del proyectoClases de libros y usuarios3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online