Privado por convención
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 13 de 65.
GDScript no tiene la palabra clave private: se puede acceder a todas las propiedades y métodos de un objeto desde otros scripts. La convención de Godot es usar un guion bajo al inicio. Se pretende que _coins y _is_valid(), a continuación, se usen únicamente en el código de la propia clase:
# wallet.gd
class_name Wallet
extends RefCounted
var _coins: int = 0
func add(amount: int) -> void:
if _is_valid(amount):
_coins += amount
func spend(amount: int) -> bool:
if not _is_valid(amount) or amount > _coins:
return false
_coins -= amount
return true
func get_coins() -> int:
return _coins
func _is_valid(amount: int) -> bool:
return amount > 0Otros scripts usan los métodos públicos, y estos comprueban cada cambio: spend() se niega a quitar más monedas de las que contiene la cartera, así que el número de monedas nunca baja de cero.
var wallet := Wallet.new()
wallet.add(50)
wallet.add(-20)
print(wallet.spend(80)) # false
print(wallet.get_coins()) # 50El guion bajo es una promesa, no un bloqueo: wallet._coins = -999 se ejecuta sin ningún error. Cumplir la promesa depende de quien escriba los otros scripts, así que no leas ni cambies miembros con guion bajo desde fuera de su clase.
Ya conoces dos nombres con guion bajo del propio Godot: el motor llama a _ready() y _init(), no tu propio código.
Desafío
FácilCompleta la clase User en user.gd. Guarda su contraseña en una propiedad privada, _password, y solo su propio código accede a ella.
- El constructor almacena la contraseña inicial
check_password(attempt)devuelve siattemptcoincide con la contraseña_is_strong(candidate), un método auxiliar privado, devuelve sicandidatetiene al menos6caractereschange_password(old_password, new_password)cambia la contraseña y devuelvetruesolo cuandoold_passwordes correcta ynew_passwordes segura. De lo contrario, no cambia nada y devuelvefalse
El código proporcionado lee la contraseña inicial, cuántos comandos siguen y los comandos check PASSWORD y change OLD NEW. Para la contraseña godot4 y los comandos change godot4 abc, change wrong longenough y check godot4, imprime:
Password not changed
Password not changed
Access grantedTu código va en user.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 user := User.new(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(" ")
if parts[0] == "check":
print("Access granted" if user.check_password(parts[1]) else "Access denied")
elif user.change_password(parts[1], parts[2]):
print("Password changed")
else:
print("Password not changed")
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