Clases internas
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 41 de 65.
Una clase puede declarar otra clase dentro de ella, con la palabra clave class, un nombre y un cuerpo con sangría. Esta clase interna es un tipo auxiliar que pertenece a la clase externa:
# inventory.gd
class_name Inventory
extends RefCounted
const MAX_STACK := 5
class Slot:
var item_name: String
var count: int
func _init(new_name: String, new_count: int) -> void:
item_name = new_name
count = mini(new_count, MAX_STACK)
func _to_string() -> String:
return "%s x%d" % [item_name, count]
var slots: Array[Slot] = []
func add(item_name: String, count: int) -> Slot:
var slot := Slot.new(item_name, count)
slots.append(slot)
return slotDentro de inventory.gd, la clase interna es Slot. Todos los demás archivos acceden a ella a través de la clase externa: Inventory.Slot.
# main.gd
var bag := Inventory.new()
bag.add("Potion", 9)
var arrows: Inventory.Slot = bag.add("Arrow", 3)
print(bag.slots) # [Potion x5, Arrow x3]
var gem := Inventory.Slot.new("Gem", 1)Una clase interna sin extends extiende RefCounted y puede tener variables, un constructor y métodos como cualquier clase. Puede usar las constantes y enumeraciones de la clase externa (MAX_STACK de arriba), pero no sus variables miembro: Slot no tiene acceso a slots, porque un espacio es un objeto independiente. Pásale a su constructor cualquier valor que necesite.
Usa una clase interna para un tipo pequeño que solo tenga sentido junto con su clase externa, como una casilla de un inventario o una entrada de una tabla de puntuaciones. Un tipo que otras partes del juego usan por sí solo merece su propio archivo y class_name.
Desafío
FácilConstruye una Leaderboard cuyas entradas sean una clase interna.
- Declara la clase interna
Entrydentro deLeaderboard, conplayer_nameyscoreestablecidos por su constructor, y_to_string()devolviendoAda: 120. entrieses un array tipado deEntry, en el orden en que aparecen los jugadores por primera vez.submit(player, score)añade una entrada nueva para un jugador nuevo. Si un jugador ya tiene una entrada, conserva la puntuación más alta de las dos.best()devuelve la entrada con la puntuación más alta. En caso de empate, gana la entrada que aparece primero.
El código proporcionado lee cuántas puntuaciones vienen a continuación (Ada 120), las envía y luego imprime todas las entradas y la mejor (siempre se proporciona al menos una puntuación). Para Ada 120, Bo 90, Ada 80, Bo 150, Cy 150, imprime:
Ada: 120
Bo: 150
Cy: 150
Best: Bo: 150Tu código va en leaderboard.gd. main.gd contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
extends Node
func _ready():
# Código de entrada/salida proporcionado: mantenlo tal como está
var board := Leaderboard.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
board.submit(parts[0], int(parts[1]))
for entry in board.entries:
print(entry)
print("Best: ", board.best())
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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 clases3Herencia
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