Menu
CoddyTech

Schreibgeschützte Eigenschaften

Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 29 von 65.

Einige Werte sollten von außen lesbar sein, aber niemals zugewiesen werden: eine ID, die einmal beim Erstellen des Objekts vergeben wird, oder ein Wert, der aus anderen Daten berechnet wird, etwa eine Fläche oder eine Summe. Eine Eigenschaft mit einem get-Block und ohne set-Block bewirkt das:

# 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

Der Konstruktor speichert den Wert in _number, das private ist, und das öffentliche number gibt ihn nur zurück. Eine Zuweisung an number von außen ist kein Fehler, ändert aber nichts, weil der Getter weiterhin _number zurückgibt:

var ticket := Ticket.new(42)
ticket.number = 7
print(ticket.number) # 42

Eine berechnete Eigenschaft hat keinen eigenen Wert: Ihr Getter berechnet den Wert jedes Mal neu, wenn sie gelesen wird, sodass er immer mit den Daten übereinstimmt, aus denen er stammt:

# 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

Eine einfache var area müsste jedes Mal manuell aktualisiert werden, wenn sich width oder length ändert, und ein vergessenes Update führt dazu, dass sie falsch ist. Die berechnete area kann nicht veralten, und niemand kann ihr einen falschen Wert zuweisen.

Für einen Wert, der für jedes Objekt gleich ist und sich nie ändert, verwende eine Konstante in der Klasse: const MAX_GUESTS = 4. Eine Zuweisung an eine Konstante wird gemeldet, bevor das Programm ausgeführt wird.

challenge icon

Aufgabe

Einfach

Die Klasse Order in order.gd speichert ihre ID in _id und die Summe jeder Position in _line_totals (Preis mal Menge). Mache ihre vier öffentlichen Eigenschaften mit get-Blöcken schreibgeschützt:

  • order_id gibt _id zurück.
  • subtotal gibt die Summe von _line_totals zurück.
  • shipping gibt 0 zurück, wenn der Zwischensummenbetrag 50 oder mehr beträgt, andernfalls 5.
  • total gibt die Zwischensumme plus den Versand zurück.

Der bereitgestellte Code liest die Bestell-ID, die Anzahl der Artikel und anschließend für jeden Artikel eine Zeile mit price quantity. Nach jedem Artikel gibt er Zwischensumme, Versand und Gesamtbetrag aus. Am Ende versucht er, alle vier Eigenschaften auf 0 zu setzen, und gibt dann die ID und den Gesamtbetrag aus, die unverändert bleiben müssen. Für die ID 7 und die Artikel 12 2 und 30 1 gibt er Folgendes aus:

Subtotal 24, shipping 5, total 29
Subtotal 54, shipping 0, total 54
Order #7: 54

Dein Code gehört in order.gd. main.gd enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

extends Node

func _ready():
	# Vorgegebener Ein-/Ausgabecode: unverändert lassen
	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])
	# Code, der versucht, die schreibgeschützten Eigenschaften zu überschreiben
	order.order_id = 0
	order.subtotal = 0
	order.shipping = 0
	order.total = 0
	print("Order #%d: %d" % [order.order_id, order.total])
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