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_numberEl 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) # 42Una 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 * lengthvar room := Room.new()
print(room.area) # 20
room.width = 6
print(room.area) # 30Un 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.
Desafío
FácilLa 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_iddevuelve_id.subtotaldevuelve la suma de_line_totals.shippingdevuelve0cuando el subtotal es50o más; de lo contrario, devuelve5.totaldevuelve 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: 54Tu 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])
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
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online