Instanz- vs. statische Variablen
Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 9 von 65.
Ein normales var in einer Klasse ist eine Instanzvariable: Jedes Objekt hat seine eigene. Ein static var gehört stattdessen zur Klasse: Es gibt einen Wert, der von allen Objekten gemeinsam genutzt wird.
# 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 AcademyLies eine statische Variable über den Klassennamen aus, wie in Student.count, ohne dass ein Objekt benötigt wird. Verwende innerhalb der Klasse ihren Namen: count += 1 in _init() zählt alle bisher erstellten Studierenden.
Eine Änderung an Student.school ändert es für alle Schüler gleichzeitig. ada.school = "Night School" würde dasselbe bewirken, denn es gibt nur eine school; der Klassenname macht das deutlich.
Ein const wird auf dieselbe Weise gemeinsam genutzt, kann sich aber niemals ändern. Verwende ein static var für gemeinsam genutzte Daten, die sich ändern, während das Programm läuft, etwa einen Zähler oder eine Einstellung, an die sich alle Objekte halten.
Aufgabe
EinfachVervollständige die Klasse BankAccount in bank_account.gd:
- eine statische
int-Variableinterest_percent, die mit2beginnt und von allen Konten gemeinsam genutzt wird - eine statische
int-Variableaccount_count, die mit0beginnt; der Konstruktor addiert für jedes neue Konto1dazu describe()gibtHOLDER: $BALANCE at PERCENT%zurück und verwendet dafür denholderund denbalancedes Kontos sowie den gemeinsameninterest_percent
Der bereitgestellte Code liest die Anzahl der folgenden Konten und anschließend je eine Zeile mit holder balance sowie einen neuen Zinssatz ein. Er gibt BankAccount.account_count und jedes Konto aus, setzt BankAccount.interest_percent auf den neuen Zinssatz und gibt anschließend jedes Konto erneut aus. Für Alice 1000, Bob 2000 und den Zinssatz 3 gibt er Folgendes aus:
Accounts opened: 2
Alice: $1000 at 2%
Bob: $2000 at 2%
After the rate change:
Alice: $1000 at 3%
Bob: $2000 at 3%Dein Code gehört in bank_account.gd. main.gd enthält den bereitgestellten Ein- und Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
extends Node
func _ready():
# Vorgegebener Ein-/Ausgabecode: unverändert lassen
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())
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort selfMethodenEigenschaftenKonstruktor (_init)Wiederholung – Einfacher Taschenrechner4Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypisierungAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner2Klassenattribute
Instanz- vs. statische VariablenStatische FunktionenProperty-SetterProperty-GetterPrivat nach KonventionWiederholung – Bankkontenverwaltung5Kapselung
Öffentliche und private MemberValidierung mit SetternInformationsverbergenSchreibgeschützte EigenschaftenRückblick – System zur Schülerverwaltung8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungInnere KlassenNodes als KomponentenRefCounted vs. NodeEnums in Klassen11Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungVererbungskettenTypprüfungen mit isWiederholung – Mitarbeiterhierarchie6Spezielle Methoden
Einführung in virtuelle MethodenDie _to_string-MethodeBenutzerdefinierte IteratorenRückblick – Benutzerdefinierte Liste9Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBeobachter-MusterStrategie-Muster12Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungÜbe selbstständig: Online-GDScript-Compiler