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()) # 70Podkreś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.
Wyzwanie
ŁatwyDokoń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 od0) i_level(zaczyna od1). - Dodaj prywatną metodę
_update_level(), która ustawia_levelna1 + _xp / 100(dzielenie całkowitoliczbowe). gain_xp(amount)dodajeamountdo_xp, wywołuje_update_level()i zwracatrue, gdy poziom wzrósł, a w przeciwnym raziefalse.get_xp()iget_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 4Twó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()])
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator GDScript online