Menu
CoddyTech

Classi interne

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 41 di 65.

Una classe può dichiarare al suo interno un’altra classe, con la parola chiave class, un nome e un corpo indentato. Questa classe interna è un tipo ausiliario che appartiene alla classe esterna:

# 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

All'interno di inventory.gd, la classe interna è Slot. Ogni altro file vi accede tramite la classe esterna: 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)

Una classe interna senza extends estende RefCounted e può avere variabili, un costruttore e metodi come qualsiasi classe. Può usare le costanti e gli enum della classe esterna (MAX_STACK sopra), ma non le sue variabili membro: Slot non ha accesso a slots, perché uno slot è un oggetto separato. Passa al suo costruttore qualsiasi valore di cui ha bisogno.

Usa una classe interna per un tipo piccolo che ha senso solo insieme alla sua classe esterna, come uno slot di un inventario o una voce di una tabella dei punteggi. Un tipo che altre parti del gioco usano autonomamente merita un file dedicato e class_name.

challenge icon

Sfida

Facile

Crea una Leaderboard le cui voci siano una classe interna.

  • Dichiara la classe interna Entry dentro Leaderboard, con player_name e score impostati dal suo costruttore e _to_string() che restituisce Ada: 120.
  • entries è un array tipizzato di Entry, nell'ordine in cui i giocatori compaiono per la prima volta.
  • submit(player, score) aggiunge una nuova voce per un nuovo giocatore. Per un giocatore che ha già una voce, mantiene il punteggio più alto tra i due.
  • best() restituisce la voce con il punteggio più alto. In caso di parità, vince la voce che compare per prima.

Il codice fornito legge quanti punteggi seguono (Ada 120), li invia, poi stampa ogni voce e la migliore (viene sempre fornito almeno un punteggio). Per Ada 120, Bo 90, Ada 80, Bo 150, Cy 150 stampa:

Ada: 120
Bo: 150
Cy: 150
Best: Bo: 150

Inserisci il tuo codice in leaderboard.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 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 iconMettiti alla prova

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

Esercitati da solo: Compilatore GDScript online