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 slotAll'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.
Sfida
FacileCrea una Leaderboard le cui voci siano una classe interna.
- Dichiara la classe interna
EntrydentroLeaderboard, conplayer_nameescoreimpostati dal suo costruttore e_to_string()che restituisceAda: 120. entriesè un array tipizzato diEntry, 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: 150Inserisci 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())
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