Proprietà di sola lettura
Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 29 di 65.
Alcuni valori dovrebbero essere leggibili dall'esterno, ma non dovrebbero mai essere assegnati: un ID impostato una sola volta alla creazione dell'oggetto oppure un valore calcolato a partire da altri dati, come un'area o un totale. Una proprietà con un blocco get e senza un blocco set serve a questo:
# ticket.gd
class_name Ticket
extends RefCounted
var _number: int
var number: int:
get:
return _number
func _init(start_number: int) -> void:
_number = start_numberIl costruttore memorizza il valore in _number privato e number pubblico lo restituisce soltanto. Assegnare un valore a number dall'esterno non è un errore, ma non cambia nulla, perché il getter continua a restituire _number:
var ticket := Ticket.new(42)
ticket.number = 7
print(ticket.number) # 42Una proprietà calcolata non ha un valore proprio: il suo getter calcola il valore ogni volta che viene letto, quindi corrisponde sempre ai dati da cui deriva:
# 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) # 30Una semplice var area dovrebbe essere aggiornata manualmente ogni volta che cambiano width o length, e basta dimenticare un aggiornamento perché il valore sia errato. Il valore calcolato di area non può diventare obsoleto e nessuno può assegnargli un valore errato.
Per un valore uguale per ogni oggetto e che non cambia mai, usa una costante nella classe: const MAX_GUESTS = 4. Un'assegnazione a una costante viene segnalata prima che il programma venga eseguito.
Sfida
FacileLa classe Order in order.gd memorizza il suo ID in _id e il totale di ogni riga in _line_totals (prezzo per quantità). Rendi di sola lettura le sue quattro proprietà pubbliche usando blocchi get:
order_idrestituisce_id.subtotalrestituisce la somma di_line_totals.shippingrestituisce0quando il subtotale è50o più, altrimenti5.totalrestituisce il subtotale più la spedizione.
Il codice fornito legge l'ID dell'ordine, il numero di articoli e poi una riga price quantity per ogni articolo. Dopo ogni articolo stampa il subtotale, la spedizione e il totale. Alla fine prova a impostare tutte e quattro le proprietà a 0, poi stampa l'ID e il totale, che devono rimanere invariati. Per l'ID 7 e gli articoli 12 2 e 30 1 stampa:
Subtotal 24, shipping 5, total 29
Subtotal 54, shipping 0, total 54
Order #7: 54Il tuo codice va in order.gd. main.gd contiene il codice fornito per input/output e non può essere modificato.
Provalo tu
extends Node
func _ready():
# Código de entrada/salida proporcionado: déjalo tal como está
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])
# Código que intenta sobrescribir las propiedades de solo lectura
order.order_id = 0
order.subtotal = 0
order.shipping = 0
order.total = 0
print("Order #%d: %d" % [order.order_id, order.total])
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore GDScript online