Menu
CoddyTech

Propiedades de solo lectura

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 29 de 65.

Algunos valores deberían poder leerse desde fuera, pero nunca asignarse: un ID que se asigna una sola vez al crear el objeto, o un valor calculado a partir de otros datos, como un área o un total. Una propiedad con un bloque get y sin un bloque set permite hacerlo:

# 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

El constructor almacena el valor en el atributo privado _number, y el atributo público number solo lo devuelve. Asignar un valor a number desde fuera no es un error, pero no cambia nada, porque el getter sigue devolviendo _number:

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

Una propiedad calculada no tiene un valor propio: su getter calcula el valor cada vez que se lee, por lo que siempre coincide con los datos de los que proviene:

# 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

Un var area simple tendría que actualizarse manualmente cada vez que cambie width o length, y olvidarse de una actualización hace que quede incorrecta. El valor calculado de area no puede quedar desactualizado, y nadie puede asignarle un valor incorrecto.

Para un valor que es igual para todos los objetos y nunca cambia, usa una constante en la clase: const MAX_GUESTS = 4. La asignación a una constante se informa antes de que se ejecute el programa.

challenge icon

Desafío

Fácil

La clase Order de order.gd almacena su identificador en _id y el total de cada línea en _line_totals (precio por cantidad). Haz que sus cuatro propiedades públicas sean de solo lectura mediante bloques get:

  • order_id devuelve _id.
  • subtotal devuelve la suma de _line_totals.
  • shipping devuelve 0 cuando el subtotal es 50 o más; de lo contrario, devuelve 5.
  • total devuelve el subtotal más el envío.

El código proporcionado lee el identificador del pedido, el número de artículos y, después, una línea price quantity por cada artículo. Después de cada artículo, imprime el subtotal, el envío y el total. Al final intenta establecer las cuatro propiedades en 0 y luego imprime el identificador y el total, que deben permanecer sin cambios. Para el identificador 7 y los artículos 12 2 y 30 1, imprime:

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

Tu código va en order.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

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])
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online