Propriétés en lecture seule
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 29 sur 65.
Certaines valeurs doivent pouvoir être lues de l’extérieur, mais jamais assignées : un ID attribué une seule fois à la création de l’objet, ou une valeur calculée à partir d’autres données, comme une aire ou un total. Une propriété avec un bloc get et sans bloc set permet cela :
# ticket.gd
class_name Ticket
extends RefCounted
var _number: int
var number: int:
get:
return _number
func _init(start_number: int) -> void:
_number = start_numberLe constructeur stocke la valeur dans l’attribut privé _number, et l’attribut public number ne fait que la renvoyer. Affecter une valeur à number depuis l’extérieur n’est pas une erreur, mais cela ne change rien, car le getter continue de renvoyer _number :
var ticket := Ticket.new(42)
ticket.number = 7
print(ticket.number) # 42Une propriété calculée n’a pas de valeur propre : son accesseur calcule la valeur à chaque lecture, de sorte qu’elle correspond toujours aux données dont elle est issue :
# 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) # 30Une simple var area devrait être mise à jour manuellement chaque fois que width ou length change, et un oubli suffit à la rendre incorrecte. La area calculée ne peut pas devenir obsolète, et personne ne peut lui attribuer une valeur incorrecte.
Pour une valeur identique pour chaque objet et qui ne change jamais, utilisez une constante dans la classe : const MAX_GUESTS = 4. Toute tentative d’affectation à une constante est signalée avant l’exécution du programme.
Défi
FacileLa classe Order dans order.gd stocke son identifiant dans _id et le total de chaque ligne dans _line_totals (prix multiplié par quantité). Rendez ses quatre propriétés publiques accessibles en lecture seule avec des blocs get :
order_idrenvoie_id.subtotalrenvoie la somme de_line_totals.shippingrenvoie0lorsque le sous-total est supérieur ou égal à50, sinon5.totalrenvoie le sous-total plus les frais de livraison.
Le code fourni lit l’identifiant de la commande, le nombre d’articles, puis une ligne price quantity par article. Après chaque article, il affiche le sous-total, les frais de livraison et le total. À la fin, il essaie de définir les quatre propriétés à 0, puis affiche l’identifiant et le total, qui doivent rester inchangés. Pour l’identifiant 7 et les articles 12 2 et 30 1, il affiche :
Subtotal 24, shipping 5, total 29
Subtotal 54, shipping 0, total 54
Order #7: 54Votre code va dans order.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
extends Node
func _ready():
# Code d'entrée/sortie fourni : conservez-le tel quel
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 qui tente d'écraser les propriétés en lecture seule
order.order_id = 0
order.subtotal = 0
order.shipping = 0
order.total = 0
print("Order #%d: %d" % [order.order_id, order.total])
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé selfMéthodesPropriétésConstructeur (_init)Récapitulatif - Calculatrice simple4Polymorphisme
Retour sur la redéfinition des méthodesTypage canardClasses et méthodes abstraitesConception d’interfacesRécapitulatif – Calculateur de formes7Signaux
Qu’est-ce qu’un signal ?Déclarer et émettreSe connecter aux signauxSignaux avec argumentsRécapitulatif - système de santé10Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron Composite2Propriétés de classe
Variables d’instance et variables statiquesFonctions statiquesSetters de propriétésGetters de propriétésPrivé par conventionRécapitulatif - Gestionnaire de comptes bancaires5Encapsulation
Membres publics et privésValidation avec les méthodes setterMasquage de l’informationPropriétés en lecture seuleRécapitulatif - Système de dossiers étudiants8Concepts avancés de la POO
Composition ou héritageClasses internesLes nœuds comme composantsRefCounted ou NodeEnums dans les classes3Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodesChaînes d’héritageVérifier les types avec isRécapitulatif – Hiérarchie des employés6Méthodes spéciales
Introduction aux méthodes virtuellesLa méthode _to_stringItérateurs personnalisésRécapitulatif – Liste personnalisée9Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur GDScript en ligne