Enum nelle classi
Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 44 di 65.
Un enum può essere dichiarato all'interno di una classe, accanto alle sue variabili. Le opzioni appartengono quindi a quella 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 di weapon.gd l'enum è Kind. Ogni altro file scrive prima il nome della classe, Weapon.Kind.BOW, nei valori, nelle annotazioni di tipo e nei pattern 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 30Le opzioni sono ancora numeri: Weapon.new(Weapon.Kind.BOW).kind stampa 1. L'enumerazione stessa funziona come un dizionario che associa nomi a numeri:
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))Il ciclo stampa SWORD: 20, BOW: 15 e STAFF: 30. GDScript non verifica che un numero sia una delle opzioni: Weapon.new(7) crea un'arma il cui kind è 7. Passa le opzioni con nome e il codice rimane corretto.
Un'enumerazione che descrive una classe appartiene a quella classe, così chi legge vede da dove viene Kind in Weapon.Kind.BOW.
Sfida
FacileOrdina le pozioni con un'enumerazione definita nella classe Potion.
- In
potion.gd, dichiaraenum Kind { HEAL, MANA, POISON }e assegna akindil tipoKind. Potion.from_text(text, strength)è una funzione statica che trasforma"MANA"inKind.MANAe restituisce una nuova pozione.describe()restituisceHEAL potion: +20 HP,MANA potion: +15 MPoppurePOISON potion: -5 HP, usando il nome del tipo e la forza.- In
belt.gd,summary()restituisce una riga per ogni tipo, nell'ordine dell'enumerazione:HEAL: 2 (35 total), con il numero di pozioni di quel tipo e, tra parentesi, la somma delle loro forze. Anche i tipi senza pozioni hanno una riga.
Il codice fornito legge quante pozioni seguono (HEAL 20), le aggiunge una alla volta alla cintura, stampa la descrizione e poi il riepilogo. Per HEAL 20, POISON 5, HEAL 15 stampa:
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)Il tuo codice va inserito in potion.gd e belt.gd. main.gd contiene il codice fornito per l'input/output e non può essere modificato.
Provalo tu
extends Node
func _ready():
# Codice di input/output fornito: lascialo così com'è
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)
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore GDScript online