Menu
CoddyTech

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_number

Konstruktor 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) # 42

Wł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 * length
var room := Room.new()
print(room.area) # 20
room.width = 6
print(room.area) # 30

Zwykłą 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.

challenge icon

Wyzwanie

Łatwy

Klasa 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_id zwraca _id.
  • subtotal zwraca sumę wartości _line_totals.
  • shipping zwraca 0, gdy suma częściowa wynosi 50 lub więcej, a w przeciwnym razie 5.
  • total zwraca 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: 54

Umieść 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])
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