Variáveis de Instância vs. Estáticas
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 9 de 65.
Uma var normal em uma classe é uma variável de instância: cada objeto tem a sua própria. Uma static var pertence à classe: há um único valor, compartilhado por todos os objetos.
# student.gd
class_name Student
extends RefCounted
static var school: String = "Godot High"
static var count: int = 0
var student_name: String
func _init(new_name: String) -> void:
student_name = new_name
count += 1var ada := Student.new("Ada")
var bo := Student.new("Bo")
print(Student.count) # 2
print(ada.student_name, " and ", bo.student_name) # Ada and Bo
Student.school = "Godot Academy"
print(ada.school) # Godot Academy
print(bo.school) # Godot AcademyLeia uma variável estática pelo nome da classe, como em Student.count, sem precisar de um objeto. Dentro da classe, use seu nome: count += 1 em _init() contabiliza cada estudante criado até agora.
Alterar Student.school muda o valor para todos os estudantes de uma só vez. ada.school = "Night School" faria o mesmo, porque há apenas um school; escrever o nome da classe deixa isso claro.
Uma const é compartilhada da mesma forma, mas nunca pode mudar. Use uma static var para dados compartilhados que mudam enquanto o programa é executado, como um contador ou uma configuração que todos os objetos seguem.
Desafio
FácilComplete a classe BankAccount em bank_account.gd:
- uma variável
intestáticainterest_percentque começa em2, compartilhada por todas as contas - uma variável
intestáticaaccount_countque começa em0; o construtor adiciona1a ela para cada nova conta describe()retornaHOLDER: $BALANCE at PERCENT%, usandoholderebalanceda conta e ointerest_percentcompartilhado
O código fornecido lê quantas contas vêm a seguir e uma linha holder balance para cada uma, depois uma nova taxa de juros. Ele imprime BankAccount.account_count e todas as contas, define BankAccount.interest_percent como a nova taxa e imprime todas as contas novamente. Para Alice 1000, Bob 2000 e a taxa 3, ele imprime:
Accounts opened: 2
Alice: $1000 at 2%
Bob: $2000 at 2%
After the rate change:
Alice: $1000 at 3%
Bob: $2000 at 3%Seu código deve ficar em bank_account.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 accounts: Array[BankAccount] = []
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
accounts.append(BankAccount.new(parts[0], int(parts[1])))
print("Accounts opened: %d" % BankAccount.account_count)
for account in accounts:
print(account.describe())
BankAccount.interest_percent = int(OS.read_string_from_stdin())
print("After the rate change:")
for account in accounts:
print(account.describe())
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