Enums dans les classes
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 44 sur 65.
Une énumération peut être déclarée à l’intérieur d’une classe, à côté de ses variables. Les options appartiennent alors à cette 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.STAFFDans weapon.gd, l’énumération est Kind. Tous les autres fichiers écrivent d’abord le nom de la classe, Weapon.Kind.BOW, dans les valeurs, les annotations de type et les motifs 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 30Les options sont toujours des nombres : Weapon.new(Weapon.Kind.BOW).kind affiche 1. L’énumération elle-même fonctionne comme un dictionnaire associant des noms à des nombres :
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))La boucle affiche SWORD: 20, BOW: 15 et STAFF: 30. GDScript ne vérifie pas qu’un nombre fait partie des options : Weapon.new(7) crée une arme dont kind vaut 7. Passe les options nommées et le code restera correct.
Une énumération qui décrit une classe doit se trouver à l’intérieur de cette classe, afin que le lecteur voie d’où vient Kind dans Weapon.Kind.BOW.
Défi
FacileTrie les potions avec une énumération qui se trouve dans la classe Potion.
- Dans
potion.gd, déclareenum Kind { HEAL, MANA, POISON }et donne àkindle typeKind. Potion.from_text(text, strength)est une fonction statique qui transforme"MANA"enKind.MANAet renvoie une nouvelle potion.describe()renvoieHEAL potion: +20 HP,MANA potion: +15 MPouPOISON potion: -5 HP, en utilisant le nom du type et sa puissance.- Dans
belt.gd,summary()renvoie une ligne par type, dans l’ordre de l’énumération :HEAL: 2 (35 total), avec le nombre de potions de ce type et, entre parenthèses, la somme de leur puissance. Les types sans potion ont aussi une ligne.
Le code fourni lit le nombre de potions qui suivent (HEAL 20), ajoute chacune à la ceinture, affiche sa description puis le récapitulatif. Pour HEAL 20, POISON 5, HEAL 15, il affiche :
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)Ton code va dans potion.gd et belt.gd. main.gd contient le code fourni pour les entrées et sorties et ne peut pas être modifié.
Essayez vous-même
extends Node
func _ready():
# Code d'entrée/sortie fourni : conservez-le tel quel
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)
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé selfMéthodesPropriétésConstructeur (_init)Récapitulatif - Calculatrice simple4Polymorphisme
Retour sur la redéfinition des méthodesTypage canardClasses et méthodes abstraitesConception d’interfacesRécapitulatif – Calculateur de formes7Signaux
Qu’est-ce qu’un signal ?Déclarer et émettreSe connecter aux signauxSignaux avec argumentsRécapitulatif - système de santé10Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron Composite2Propriétés de classe
Variables d’instance et variables statiquesFonctions statiquesSetters de propriétésGetters de propriétésPrivé par conventionRécapitulatif - Gestionnaire de comptes bancaires5Encapsulation
Membres publics et privésValidation avec les méthodes setterMasquage de l’informationPropriétés en lecture seuleRécapitulatif - Système de dossiers étudiants8Concepts avancés de la POO
Composition ou héritageClasses internesLes nœuds comme composantsRefCounted ou NodeEnums dans les classes3Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodesChaînes d’héritageVérifier les types avec isRécapitulatif – Hiérarchie des employés6Méthodes spéciales
Introduction aux méthodes virtuellesLa méthode _to_stringItérateurs personnalisésRécapitulatif – Liste personnalisée9Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur GDScript en ligne