Menu
CoddyTech

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 slot

Dans 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.

challenge icon

Défi

Facile

Crée un Leaderboard dont les entrées sont une classe interne.

  • Déclare la classe interne Entry dans Leaderboard, avec player_name et score définis par son constructeur, et _to_string() qui renvoie Ada: 120.
  • entries est un tableau typé de Entry, 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: 150

Ton 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())
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur GDScript en ligne