Menu
CoddyTech

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 slot

Dentro 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.

challenge icon

Desafío

Fácil

Construye una Leaderboard cuyas entradas sean una clase interna.

  • Declara la clase interna Entry dentro de Leaderboard, con player_name y score establecidos por su constructor, y _to_string() devolviendo Ada: 120.
  • entries es un array tipado de Entry, 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: 150

Tu 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())
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de GDScript online