Właściwości tylko do odczytu
Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 29 z 65.
Niektóre wartości powinny być możliwe do odczytania z zewnątrz, ale nigdy nie powinny być przypisywane: identyfikator nadany raz podczas tworzenia obiektu albo wartość obliczona na podstawie innych danych, taka jak pole powierzchni lub suma. Właśnie to zapewnia właściwość z blokiem get i bez bloku set:
# ticket.gd
class_name Ticket
extends RefCounted
var _number: int
var number: int:
get:
return _number
func _init(start_number: int) -> void:
_number = start_numberKonstruktor zapisuje wartość w prywatnym _number, a publiczne number tylko ją zwraca. Przypisanie wartości do number z zewnątrz nie jest błędem, ale niczego nie zmienia, ponieważ getter nadal zwraca _number:
var ticket := Ticket.new(42)
ticket.number = 7
print(ticket.number) # 42Właściwość obliczana nie ma własnej wartości: jej getter oblicza wartość za każdym razem, gdy jest odczytywana, dzięki czemu zawsze odpowiada danym, z których pochodzi:
# room.gd
class_name Room
extends RefCounted
var width: int = 4
var length: int = 5
var area: int:
get:
return width * lengthvar room := Room.new()
print(room.area) # 20
room.width = 6
print(room.area) # 30Zwykłą zmienną var area trzeba byłoby aktualizować ręcznie za każdym razem, gdy zmienia się width lub length, a pominięcie choć jednej aktualizacji sprawia, że jej wartość jest nieprawidłowa. Obliczona wartość area nie może się zdezaktualizować i nikt nie może przypisać jej nieprawidłowej wartości.
W przypadku wartości, która jest taka sama dla każdego obiektu i nigdy się nie zmienia, użyj stałej w klasie: const MAX_GUESTS = 4. Próba przypisania wartości do stałej jest zgłaszana przed uruchomieniem programu.
Wyzwanie
ŁatwyKlasa Order w pliku order.gd przechowuje swoje ID w _id, a sumę każdej pozycji w _line_totals (cena razy liczba sztuk). Ustaw cztery publiczne właściwości jako tylko do odczytu, używając bloków get:
order_idzwraca_id.subtotalzwraca sumę wartości_line_totals.shippingzwraca0, gdy suma częściowa wynosi50lub więcej, a w przeciwnym razie5.totalzwraca sumę częściową powiększoną o koszt wysyłki.
Dostarczony kod odczytuje ID zamówienia, liczbę produktów, a następnie jeden wiersz price quantity dla każdego produktu. Po każdym produkcie wypisuje sumę częściową, koszt wysyłki i sumę całkowitą. Na końcu próbuje ustawić wszystkie cztery właściwości na 0, a następnie wypisuje ID i sumę całkowitą, które muszą pozostać bez zmian. Dla ID 7 oraz produktów 12 2 i 30 1 wypisuje:
Subtotal 24, shipping 5, total 29
Subtotal 54, shipping 0, total 54
Order #7: 54Umieść swój kod w pliku order.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 order := Order.new(int(OS.read_string_from_stdin()))
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
order.add_item(int(parts[0]), int(parts[1]))
print("Subtotal %d, shipping %d, total %d" % [order.subtotal, order.shipping, order.total])
# Kod, który próbuje nadpisać właściwości tylko do odczytu
order.order_id = 0
order.subtotal = 0
order.shipping = 0
order.total = 0
print("Order #%d: %d" % [order.order_id, order.total])
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