Menu
CoddyTech

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_number

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

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

Une 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.

challenge icon

Défi

Facile

La 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_id renvoie _id.
  • subtotal renvoie la somme de _line_totals.
  • shipping renvoie 0 lorsque le sous-total est supérieur ou égal à 50, sinon 5.
  • total renvoie 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: 54

Votre 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])
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur GDScript en ligne