Enums em Classes
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 44 de 65.
Um enum pode ser declarado dentro de uma classe, ao lado de suas variáveis. As opções então pertencem a essa classe:
# 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, o enum é Kind. Todos os outros arquivos escrevem primeiro o nome da classe, Weapon.Kind.BOW, em valores, anotações de tipo e padrões 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 30As opções ainda são números: Weapon.new(Weapon.Kind.BOW).kind imprime 1. O próprio enum funciona como um dicionário de nomes para 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))O loop imprime SWORD: 20, BOW: 15 e STAFF: 30. GDScript não verifica se um número corresponde a uma das opções: Weapon.new(7) cria uma arma cujo kind é 7. Passe as opções nomeadas para manter o código correto.
Um enum que descreve uma classe deve ficar dentro dessa classe, para que o leitor veja de onde vem Kind em Weapon.Kind.BOW.
Desafio
FácilOrdene poções com um enum que fica na classe Potion.
- Em
potion.gd, declareenum Kind { HEAL, MANA, POISON }e defina o tipo dekindcomoKind. Potion.from_text(text, strength)é uma função estática que transforma"MANA"emKind.MANAe retorna uma nova poção.describe()retornaHEAL potion: +20 HP,MANA potion: +15 MPouPOISON potion: -5 HP, usando o nome do tipo e a força.- Em
belt.gd,summary()retorna uma linha por tipo, na ordem do enum:HEAL: 2 (35 total), com o número de poções daquele tipo e, entre parênteses, a soma de suas forças. Tipos sem poções também recebem uma linha.
O código fornecido lê quantas poções vêm a seguir (HEAL 20), adiciona cada uma ao cinto, imprime sua descrição e, em seguida, o resumo. Para HEAL 20, POISON 5, HEAL 15, ele 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)Seu código deve ficar em potion.gd e belt.gd. main.gd contém o código de entrada/saída fornecido e não pode ser editado.
Experimente você mesmo
extends Node
func _ready():
# Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação orientada a objetos
1Fundamentos da POO
Arquivos externosIntrodução à POOClasses vs. objetosA palavra-chave selfMétodosPropriedadesConstrutor (_init)Revisão - Calculadora simples4Polimorfismo
Revisitando a Sobrescrita de MétodosDuck TypingClasses e Métodos AbstratosDesign de InterfacesRevisão - Calculadora de Formas7Sinais
O que é um sinal?Declarando e emitindoConectando-se a sinaisSinais com argumentosRevisão - Sistema de saúde10Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite2Propriedades de Classe
Variáveis de Instância vs. EstáticasFunções EstáticasMétodos Setters de PropriedadeMétodos Getters de PropriedadePrivado por ConvençãoRecapitulando: Gerenciador de Conta Bancária5Encapsulamento
Membros públicos e privadosValidação com settersOcultação de informaçõesPropriedades somente para leituraRevisão - Sistema de registros de alunos8Conceitos Avançados de POO
Composição vs. HerançaClasses InternasNós como ComponentesRefCounted vs. NodeEnums em Classes3Herança
Herança básicaA palavra-chave superSobrescrita de métodosCadeias de herançaVerificações de tipo com isRevisão - Hierarquia de funcionários6Métodos especiais
Introdução aos métodos virtuaisO método _to_stringIteradores personalizadosRevisão - Lista personalizada9Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de GDScript online