Menu
CoddyTech

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 += 1
var 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 Academy

Leia 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.

challenge icon

Desafio

Fácil

Complete a classe BankAccount em bank_account.gd:

  • uma variável int estática interest_percent que começa em 2, compartilhada por todas as contas
  • uma variável int estática account_count que começa em 0; o construtor adiciona 1 a ela para cada nova conta
  • describe() retorna HOLDER: $BALANCE at PERCENT%, usando holder e balance da conta e o interest_percent compartilhado

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())
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de GDScript online