Privado por Convenção
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 13 de 65.
GDScript não tem a palavra-chave private: todas as propriedades e métodos de um objeto podem ser acessados por outros scripts. A convenção do Godot é usar um sublinhado inicial. _coins e _is_valid() abaixo são destinados apenas ao código da própria classe:
# 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 > 0Outros scripts usam os métodos públicos, e eles verificam cada alteração: spend() se recusa a retirar mais moedas do que a carteira contém, então o número de moedas nunca fica abaixo de zero.
var wallet := Wallet.new()
wallet.add(50)
wallet.add(-20)
print(wallet.spend(80)) # false
print(wallet.get_coins()) # 50O sublinhado é uma promessa, não uma trava: wallet._coins = -999 é executado sem nenhum erro. Cumprir essa promessa cabe a quem escreve os outros scripts, então não leia nem altere membros com sublinhado de fora da classe deles.
Você já conhece dois nomes com sublinhado do próprio Godot: _ready() e _init() são chamados pelo mecanismo, não pelo seu próprio código.
Desafio
FácilComplete a classe User em user.gd. Ela mantém sua senha em uma propriedade privada, _password, e somente o próprio código dela a acessa.
- O construtor armazena a senha inicial
check_password(attempt)retorna seattemptcorresponde à senha_is_strong(candidate), um método auxiliar privado, retorna secandidatetem pelo menos6caractereschange_password(old_password, new_password)altera a senha e retornatruesomente quandoold_passwordestá correta enew_passwordé forte. Caso contrário, não altera nada e retornafalse
O código fornecido lê a senha inicial, quantos comandos vêm em seguida e os comandos check PASSWORD e change OLD NEW. Para a senha godot4 e os comandos change godot4 abc, change wrong longenough e check godot4, ele imprime:
Password not changed
Password not changed
Access grantedSeu código deve ficar em user.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 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 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