Enums en clases
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 44 de 65.
Un enumerado puede declararse dentro de una clase, junto a sus variables. Las opciones pertenecen entonces a esa clase:
# weapon.gd
class_name Weapon
extends RefCounted
enum Kind { SWORD, BOW, STAFF }
var kind: Kind
func _init(weapon_kind: Kind) -> void:
kind = weapon_kind
func is_ranged() -> bool:
return kind == Kind.BOW or kind == Kind.STAFFDentro de weapon.gd, la enumeración es Kind. En todos los demás archivos, primero se escribe el nombre de la clase, Weapon.Kind.BOW, en los valores, en las anotaciones de tipo y en los patrones de match:
# blacksmith.gd
class_name Blacksmith
extends RefCounted
static func repair_cost(kind: Weapon.Kind) -> int:
match kind:
Weapon.Kind.SWORD:
return 20
Weapon.Kind.BOW:
return 15
return 30Las opciones siguen siendo números: Weapon.new(Weapon.Kind.BOW).kind imprime 1. El propio enum funciona como un diccionario que relaciona nombres con números:
print(Weapon.Kind.keys()) # ["SWORD", "BOW", "STAFF"]
print(Weapon.Kind.find_key(1)) # BOW
print(Weapon.Kind["STAFF"]) # 2
print(Weapon.Kind.size()) # 3
for kind in Weapon.Kind.values():
print(Weapon.Kind.find_key(kind), ": ", Blacksmith.repair_cost(kind))El bucle imprime SWORD: 20, BOW: 15 y STAFF: 30. GDScript no comprueba que un número sea una de las opciones: Weapon.new(7) crea un arma cuyo kind es 7. Pasa las opciones con nombre y el código seguirá siendo correcto.
Una enumeración que describe una clase debe estar dentro de esa clase, para que el lector vea de dónde viene Kind en Weapon.Kind.BOW.
Desafío
FácilOrdena las pociones con un enum que se encuentra en la clase Potion.
- En
potion.gd, declaraenum Kind { HEAL, MANA, POISON }y asigna akindel tipoKind. Potion.from_text(text, strength)es una función estática que convierte"MANA"enKind.MANAy devuelve una poción nueva.describe()devuelveHEAL potion: +20 HP,MANA potion: +15 MPoPOISON potion: -5 HP, usando el nombre del tipo y la fuerza.- En
belt.gd,summary()devuelve una línea por cada tipo, en el orden del enum:HEAL: 2 (35 total), con el número de pociones de ese tipo y, entre paréntesis, la suma de sus fuerzas. Los tipos que no tengan pociones también reciben una línea.
El código proporcionado lee cuántas pociones vienen a continuación (HEAL 20), añade cada una al cinturón, imprime su descripción y después el resumen. Para HEAL 20, POISON 5, HEAL 15, imprime:
Added HEAL potion: +20 HP
Added POISON potion: -5 HP
Added HEAL potion: +15 HP
HEAL: 2 (35 total)
MANA: 0 (0 total)
POISON: 1 (5 total)Tu código va en potion.gd y belt.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: mantenlo tal como está
var belt := Belt.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
var potion := Potion.from_text(parts[0], int(parts[1]))
belt.add(potion)
print("Added ", potion.describe())
for line in belt.summary():
print(line)
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