Menu
CoddyTech

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 += 1
var 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 Academy

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

challenge icon

Aufgabe

Einfach

Vervollständige die Klasse BankAccount in bank_account.gd:

  • eine statische int-Variable interest_percent, die mit 2 beginnt und von allen Konten gemeinsam genutzt wird
  • eine statische int-Variable account_count, die mit 0 beginnt; der Konstruktor addiert für jedes neue Konto 1 dazu
  • describe() gibt HOLDER: $BALANCE at PERCENT% zurück und verwendet dafür den holder und den balance des Kontos sowie den gemeinsamen interest_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())
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler