Métodos setter de propiedades
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 11 de 65.
Una propiedad puede ejecutar código cada vez que se le asigna un valor. Pon dos puntos después de la declaración y añade un bloque set(value): con sangría: su setter:
# player.gd
var health: int = 100:
set(value):
health = clampi(value, 0, 100)value es lo que se está asignando. Dentro del setter, asignar health almacena el valor en la propiedad; no vuelve a ejecutar el setter. Este setter mantiene health entre 0 y 100, independientemente de lo que asigne el resto del programa:
var p := Player.new()
p.health -= 30
print(p.health) # 70
p.health = 250
print(p.health) # 100
p.health -= 500
print(p.health) # 0El setter se ejecuta en cada asignación, también dentro de la clase: health -= 10 en un método de Player y health = start_health en _init() pasan por él. Solo el valor inicial después de = en la declaración se almacena sin llamarlo.
Un setter también puede rechazar un valor. Si no asigna la propiedad, el valor anterior se mantiene:
var level: int = 1:
set(value):
if value > level:
level = valueOmite el tipo de value: set(value: int): es un error. El tipo propio de la propiedad ya indica qué contiene.
Desafío
FácilDale a la propiedad health de la clase Player en player.gd un setter que:
- mantenga la salud almacenada entre
0ymax_health: un valor mayor se almacena comomax_healthy uno negativo como0 - imprima
Player is down!cuando la nueva salud sea0y la salud anterior fuera mayor que0
El código proporcionado lee cuántos comandos siguen y, después, uno por línea: damage N (player.health -= N), heal N (player.health += N) o set N (player.health = N). Después de cada comando, imprime la salud. Para damage 30, heal 50, damage 120 y heal 10, imprime:
Health: 70
Health: 100
Player is down!
Health: 0
Health: 10Tu código va en player.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: mantenlo tal 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 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