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_numberDer 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) # 42Eine 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 * lengthvar room := Room.new()
print(room.area) # 20
room.width = 6
print(room.area) # 30Eine 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.
Aufgabe
EinfachDie 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_idgibt_idzurück.subtotalgibt die Summe von_line_totalszurück.shippinggibt0zurück, wenn der Zwischensummenbetrag50oder mehr beträgt, andernfalls5.totalgibt 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: 54Dein 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])
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort selfMethodenEigenschaftenKonstruktor (_init)Wiederholung – Einfacher Taschenrechner4Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypisierungAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner2Klassenattribute
Instanz- vs. statische VariablenStatische FunktionenProperty-SetterProperty-GetterPrivat nach KonventionWiederholung – Bankkontenverwaltung5Kapselung
Öffentliche und private MemberValidierung mit SetternInformationsverbergenSchreibgeschützte EigenschaftenRückblick – System zur Schülerverwaltung8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungInnere KlassenNodes als KomponentenRefCounted vs. NodeEnums in Klassen11Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungVererbungskettenTypprüfungen mit isWiederholung – Mitarbeiterhierarchie6Spezielle Methoden
Einführung in virtuelle MethodenDie _to_string-MethodeBenutzerdefinierte IteratorenRückblick – Benutzerdefinierte Liste9Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBeobachter-MusterStrategie-Muster12Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungÜbe selbstständig: Online-GDScript-Compiler