Métodos Setters de Propriedade
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 11 de 65.
Uma propriedade pode executar código sempre que recebe um valor. Coloque dois-pontos após a declaração e adicione um bloco set(value): indentado, seu setter:
# player.gd
var health: int = 100:
set(value):
health = clampi(value, 0, 100)value é o valor que está sendo atribuído. Dentro do setter, atribuir health armazena o valor na propriedade; isso não executa o setter novamente. Esse setter mantém health entre 0 e 100, independentemente do que o restante do programa atribuir:
var p := Player.new()
p.health -= 30
print(p.health) # 70
p.health = 250
print(p.health) # 100
p.health -= 500
print(p.health) # 0O setter é executado a cada atribuição, inclusive dentro da classe: health -= 10 em um método de Player e health = start_health em _init() passam por ele. Somente o valor inicial após = na declaração é armazenado sem chamá-lo.
Um setter também pode recusar um valor. Se ele não atribuir um valor à propriedade, o valor antigo permanece:
var level: int = 1:
set(value):
if value > level:
level = valueDeixe o tipo de fora de value: set(value: int): é um erro. O tipo da própria propriedade já indica o que ela contém.
Desafio
FácilDê à propriedade health da classe Player em player.gd um setter que:
- mantenha a saúde armazenada entre
0emax_health: um valor maior é armazenado comomax_healthe um valor negativo como0 - imprima
Player is down!quando a nova saúde for0e a saúde antiga estiver acima de0
O código fornecido lê quantos comandos vêm a seguir e, então, um por linha: damage N (player.health -= N), heal N (player.health += N) ou set N (player.health = N). Após cada comando, ele imprime a saúde. Para damage 30, heal 50, damage 120 e heal 10, ele imprime:
Health: 70
Health: 100
Player is down!
Health: 0
Health: 10Seu código deve ficar em player.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 player := Player.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
var amount := int(parts[1])
if parts[0] == "damage":
player.health -= amount
elif parts[0] == "heal":
player.health += amount
elif parts[0] == "set":
player.health = amount
print("Health: %d" % player.health)
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