Menu
CoddyTech

Propriedades somente para leitura

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 29 de 65.

Alguns valores devem poder ser lidos de fora, mas nunca atribuídos: um ID definido uma única vez quando o objeto é criado, ou um valor calculado a partir de outros dados, como uma área ou um total. Uma propriedade com um bloco get e sem um bloco set faz isso:

# 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

O construtor armazena o valor no atributo privado _number, e o atributo público number apenas o retorna. Atribuir um valor a number de fora não é um erro, mas não muda nada, porque o getter continua retornando _number:

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

Uma propriedade computada não tem valor próprio: seu getter calcula o valor cada vez que ela é lida, então ela sempre corresponde aos dados dos quais vem:

# 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

Um var area simples teria que ser atualizado manualmente toda vez que width ou length mudasse, e uma atualização esquecida o deixaria incorreto. O area calculado não pode ficar desatualizado, e ninguém pode atribuir a ele um valor incorreto.

Para um valor que é o mesmo para todos os objetos e nunca muda, use uma constante na classe: const MAX_GUESTS = 4. Uma atribuição a uma constante é identificada antes de o programa ser executado.

challenge icon

Desafio

Fácil

A classe Order em order.gd armazena seu ID em _id e o total de cada item em _line_totals (preço vezes quantidade). Torne suas quatro propriedades públicas somente leitura usando blocos get:

  • order_id retorna _id.
  • subtotal retorna a soma de _line_totals.
  • shipping retorna 0 quando o subtotal é 50 ou mais; caso contrário, retorna 5.
  • total retorna o subtotal mais o frete.

O código fornecido lê o ID do pedido, o número de itens e, em seguida, uma linha price quantity para cada item. Após cada item, ele imprime o subtotal, o frete e o total. No fim, tenta definir as quatro propriedades como 0 e, depois, imprime o ID e o total, que devem permanecer inalterados. Para o ID 7 e os itens 12 2 e 30 1, ele imprime:

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

Seu código deve ficar em order.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

extends Node

func _ready():
	# Código de entrada/saída fornecido: mantenha-o 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 tenta sobrescrever as propriedades somente de leitura
	order.order_id = 0
	order.subtotal = 0
	order.shipping = 0
	order.total = 0
	print("Order #%d: %d" % [order.order_id, order.total])
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de GDScript online