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_numberO 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) # 42Uma 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 * lengthvar room := Room.new()
print(room.area) # 20
room.width = 6
print(room.area) # 30Um 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.
Desafio
FácilA 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_idretorna_id.subtotalretorna a soma de_line_totals.shippingretorna0quando o subtotal é50ou mais; caso contrário, retorna5.totalretorna 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: 54Seu 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])
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
1Fundamentos da POO
Arquivos externosIntrodução à POOClasses vs. objetosA palavra-chave selfMétodosPropriedadesConstrutor (_init)Revisão - Calculadora simples4Polimorfismo
Revisitando a Sobrescrita de MétodosDuck TypingClasses e Métodos AbstratosDesign de InterfacesRevisão - Calculadora de Formas7Sinais
O que é um sinal?Declarando e emitindoConectando-se a sinaisSinais com argumentosRevisão - Sistema de saúde10Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite2Propriedades de Classe
Variáveis de Instância vs. EstáticasFunções EstáticasMétodos Setters de PropriedadeMétodos Getters de PropriedadePrivado por ConvençãoRecapitulando: Gerenciador de Conta Bancária5Encapsulamento
Membros públicos e privadosValidação com settersOcultação de informaçõesPropriedades somente para leituraRevisão - Sistema de registros de alunos8Conceitos Avançados de POO
Composição vs. HerançaClasses InternasNós como ComponentesRefCounted vs. NodeEnums em Classes3Herança
Herança básicaA palavra-chave superSobrescrita de métodosCadeias de herançaVerificações de tipo com isRevisão - Hierarquia de funcionários6Métodos especiais
Introdução aos métodos virtuaisO método _to_stringIteradores personalizadosRevisão - Lista personalizada9Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de GDScript online