Öffentliche und private Member
Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 26 von 65.
Kapselung bedeutet, dass ein Objekt seine Daten zusammen mit den Methoden speichert, die diese Daten ändern, und festlegt, welche seiner Elemente anderer Code verwenden darf. Die Elemente, die für anderen Code vorgesehen sind, bilden die Schnittstelle des Objekts.
GDScript hat keine Schlüsselwörter public oder private: Auf jedes Mitglied kann von außen zugegriffen werden. Der Godot-Styleguide kennzeichnet private Mitglieder mit einem vorangestellten Unterstrich:
# bank_account.gd
class_name BankAccount
extends RefCounted
var owner_name: String
var _balance: int = 0
var _history: Array[String] = []
func _init(holder: String) -> void:
owner_name = holder
func deposit(amount: int) -> void:
_balance += amount
_record("deposit %d" % amount)
func get_balance() -> int:
return _balance
func _record(entry: String) -> void:
_history.append(entry)owner_name, deposit() und get_balance() sind öffentlich, daher verwendet main.gd sie. _balance, _history und _record() sind privat: Nur der Code in bank_account.gd verwendet sie.
# main.gd
var account := BankAccount.new("Ada")
account.deposit(50)
account.deposit(20)
print(account.owner_name) # Ada
print(account.get_balance()) # 70Der Unterstrich ist eine Konvention, keine Sperre: account._balance = 1000000 in main.gd wird ohne Fehler ausgeführt. Halte dich trotzdem an die Konvention. Wenn nur die Klasse _balance ändert, kann ein falscher Kontostand nur von einer Methode in bank_account.gd stammen – das ist also die einzige Datei, die du überprüfen musst.
GDScript hat auch keine protected-Ebene. Eine Unterklasse erbt alle Member, einschließlich der privaten. Daher kann ein SavingsAccount, das BankAccount erweitert, _balance in seinen eigenen Methoden verwenden.
Godots virtuelle Methoden wie _init() und _ready() beginnen ebenfalls mit einem Unterstrich. Godot ruft sie für dich auf, gib also niemals einer deiner privaten Methoden denselben Namen.
Aufgabe
EinfachVervollständige die Klasse Hero in hero.gd. Ihre öffentlichen Mitglieder sind hero_name, gain_xp(), get_xp() und get_level(). Der Rest ist privat:
- Füge die privaten Variablen
_xp(beginnt bei0) und_level(beginnt bei1) hinzu. - Füge die private Methode
_update_level()hinzu, die_levelauf1 + _xp / 100setzt (Ganzzahldivision). gain_xp(amount)addiertamountzu_xp, ruft_update_level()auf und gibttruezurück, wenn das Level gestiegen ist, andernfallsfalse.get_xp()undget_level()geben die privaten Werte zurück.
Der bereitgestellte Code liest den Namen des Helden, dann die Anzahl der folgenden XP-Beträge und anschließend einen Betrag pro Zeile. Nach jedem Betrag gibt er eine Zeile mit Level up! aus, wenn gain_xp() true zurückgibt, und danach den Zustand des Helden. Für Ada und die Beträge 40, 70 und 250 gibt er Folgendes aus:
Ada: 40 XP, level 1
Level up! Ada is now level 2
Ada: 110 XP, level 2
Level up! Ada is now level 4
Ada: 360 XP, level 4Dein Code gehört in hero.gd. main.gd enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
extends Node
func _ready():
# Vorgegebener Ein-/Ausgabecode: unverändert lassen
var hero := Hero.new(OS.read_string_from_stdin())
var count := int(OS.read_string_from_stdin())
for i in count:
var amount := int(OS.read_string_from_stdin())
if hero.gain_xp(amount):
print("Level up! %s is now level %d" % [hero.hero_name, hero.get_level()])
print("%s: %d XP, level %d" % [hero.hero_name, hero.get_xp(), hero.get_level()])
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