Classes internes
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 41 sur 65.
Une classe peut déclarer une autre classe à l’intérieur, avec le mot-clé class, un nom et un corps indenté. Cette classe interne est un type auxiliaire qui appartient à la classe externe :
# 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 slotDans inventory.gd, la classe interne est Slot. Tous les autres fichiers y accèdent par l’intermédiaire de la classe externe : 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)Une classe interne sans extends hérite de RefCounted, et elle peut avoir des variables, un constructeur et des méthodes comme n’importe quelle classe. Elle peut utiliser les constantes et les énumérations de la classe externe (MAX_STACK ci-dessus), mais pas ses variables membres : Slot n’a pas accès à slots, car un emplacement est un objet distinct. Transmets-lui toute valeur dont elle a besoin dans son constructeur.
Utilise une classe interne pour un petit type qui n’a de sens qu’avec sa classe externe, comme un emplacement d’inventaire ou une entrée de tableau des scores. Un type utilisé seul par d’autres parties du jeu mérite son propre fichier et class_name.
Défi
FacileCrée un Leaderboard dont les entrées sont une classe interne.
- Déclare la classe interne
EntrydansLeaderboard, avecplayer_nameetscoredéfinis par son constructeur, et_to_string()qui renvoieAda: 120. entriesest un tableau typé deEntry, dans l’ordre où les joueurs apparaissent pour la première fois.submit(player, score)ajoute une nouvelle entrée pour un nouveau joueur. Pour un joueur qui a déjà une entrée, la méthode conserve le score le plus élevé des deux.best()renvoie l’entrée avec le score le plus élevé. En cas d’égalité, l’entrée qui apparaît en premier l’emporte.
Le code fourni lit le nombre de scores qui suivent (Ada 120), les enregistre, puis affiche chaque entrée et la meilleure (au moins un score est toujours fourni). Pour Ada 120, Bo 90, Ada 80, Bo 150, Cy 150, il affiche :
Ada: 120
Bo: 150
Cy: 150
Best: Bo: 150Ton code va dans leaderboard.gd. main.gd contient le code fourni pour les entrées/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 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())
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