Menu
CoddyTech

Elementy publiczne i prywatne

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 26 z 65.

Hermetyzacja oznacza, że obiekt przechowuje swoje dane razem z metodami, które je zmieniają, i decyduje, z których jego elementów może korzystać inny kod. Elementy przeznaczone dla innego kodu tworzą interfejs obiektu.

GDScript nie ma słów kluczowych public ani private: każdy element może być dostępny z zewnątrz. W przewodniku po stylu Godot elementy prywatne oznacza się początkowym podkreśleniem:

# 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() i get_balance() są publiczne, więc korzysta z nich main.gd. _balance, _history i _record() są prywatne: korzysta z nich tylko kod w pliku bank_account.gd.

# main.gd
var account := BankAccount.new("Ada")
account.deposit(50)
account.deposit(20)
print(account.owner_name) # Ada
print(account.get_balance()) # 70

Podkreślenie to konwencja, a nie blokada: account._balance = 1000000 w pliku main.gd działa bez żadnego błędu. Mimo to trzymaj się tej konwencji. Gdy tylko klasa zmienia _balance, nieprawidłowe saldo może pochodzić wyłącznie z metody w pliku bank_account.gd, więc to właśnie ten plik musisz sprawdzić.

GDScript również nie ma poziomu protected. Klasa pochodna dziedziczy wszystkie składowe, w tym prywatne, więc SavingsAccount, która extends BankAccount, może używać _balance we własnych metodach.

Metody wirtualne Godot, takie jak _init() i _ready(), również zaczynają się od podkreślenia. Godot wywołuje je za Ciebie, więc nigdy nie nadawaj tej samej nazwy żadnej ze swoich metod prywatnych.

challenge icon

Wyzwanie

Łatwy

Dokończ klasę Hero w pliku hero.gd. Jej publiczne składowe to hero_name, gain_xp(), get_xp() i get_level(). Pozostałe są prywatne:

  • Dodaj prywatne zmienne _xp (zaczyna od 0) i _level (zaczyna od 1).
  • Dodaj prywatną metodę _update_level(), która ustawia _level na 1 + _xp / 100 (dzielenie całkowitoliczbowe).
  • gain_xp(amount) dodaje amount do _xp, wywołuje _update_level() i zwraca true, gdy poziom wzrósł, a w przeciwnym razie false.
  • get_xp() i get_level() zwracają prywatne wartości.

Dostarczony kod odczytuje imię bohatera, a następnie liczbę wartości XP, po czym odczytuje po jednej wartości w każdym wierszu. Po każdej wartości wyświetla wiersz Level up!, gdy gain_xp() zwraca true, a następnie stan bohatera. Dla Ada i wartości 40, 70 oraz 250 wyświetla:

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

Twój kod umieść w pliku hero.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
	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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online