Menu
CoddyTech

Ö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()) # 70

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

challenge icon

Aufgabe

Einfach

Vervollstä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 bei 0) und _level (beginnt bei 1) hinzu.
  • Füge die private Methode _update_level() hinzu, die _level auf 1 + _xp / 100 setzt (Ganzzahldivision).
  • gain_xp(amount) addiert amount zu _xp, ruft _update_level() auf und gibt true zurück, wenn das Level gestiegen ist, andernfalls false.
  • get_xp() und get_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 4

Dein 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()])
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