Variabili di istanza e statiche
Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 9 di 65.
Una var normale in una classe è una variabile di istanza: ogni oggetto ne ha una propria. Una static var appartiene invece alla classe: esiste un solo valore, condiviso da ogni oggetto.
# student.gd
class_name Student
extends RefCounted
static var school: String = "Godot High"
static var count: int = 0
var student_name: String
func _init(new_name: String) -> void:
student_name = new_name
count += 1var ada := Student.new("Ada")
var bo := Student.new("Bo")
print(Student.count) # 2
print(ada.student_name, " and ", bo.student_name) # Ada and Bo
Student.school = "Godot Academy"
print(ada.school) # Godot Academy
print(bo.school) # Godot AcademyLeggi una variabile statica tramite il nome della classe, come in Student.count, senza bisogno di un oggetto. All'interno della classe, usa il suo nome: count += 1 in _init() conta ogni studente creato finora.
Modificare Student.school la modifica per tutti gli studenti contemporaneamente. ada.school = "Night School" farebbe lo stesso, perché c'è un solo school; scrivere il nome della classe lo rende chiaro.
Una const è condivisa allo stesso modo, ma non può mai cambiare. Usa una static var per i dati condivisi che cambiano durante l'esecuzione del programma, come un contatore o un'impostazione seguita da tutti gli oggetti.
Sfida
FacileCompleta la classe BankAccount in bank_account.gd:
- una variabile
intstaticainterest_percentche inizia da2, condivisa da tutti i conti - una variabile
intstaticaaccount_countche inizia da0; il costruttore le aggiunge1per ogni nuovo conto describe()restituisceHOLDER: $BALANCE at PERCENT%, usandoholderebalancedel conto e il valore condivisointerest_percent
Il codice fornito legge quanti conti seguono e una riga holder balance per ciascuno, poi un nuovo tasso d'interesse. Stampa BankAccount.account_count e ogni conto, imposta BankAccount.interest_percent sul nuovo tasso e stampa di nuovo ogni conto. Con Alice 1000, Bob 2000 e il tasso 3, stampa:
Accounts opened: 2
Alice: $1000 at 2%
Bob: $2000 at 2%
After the rate change:
Alice: $1000 at 3%
Bob: $2000 at 3%Il tuo codice va in bank_account.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 accounts: Array[BankAccount] = []
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
accounts.append(BankAccount.new(parts[0], int(parts[1])))
print("Accounts opened: %d" % BankAccount.account_count)
for account in accounts:
print(account.describe())
BankAccount.interest_percent = int(OS.read_string_from_stdin())
print("After the rate change:")
for account in accounts:
print(account.describe())
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