Menu
CoddyTech

Переменные экземпляра и класса

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 9 из 65.

Обычная var в классе — это переменная экземпляра: у каждого объекта своя. static var принадлежит самому классу: есть одно значение, общее для всех объектов.

# 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

Читайте статическую переменную через имя класса, например Student.count, без необходимости создавать объект. Внутри класса используйте её имя: count += 1 в _init() учитывает каждого студента, созданного к этому моменту.

Изменение Student.school меняет его сразу для всех учащихся. ada.school = "Night School" сделало бы то же самое, потому что school всего одна; запись имени класса делает это очевидным.

const используется для общего доступа так же, но никогда не может измениться. Используй static var для общих данных, которые меняются во время работы программы, например для счётчика или настройки, которой следуют все объекты.

challenge icon

Задание

Легко

Дополните класс BankAccount в файле bank_account.gd:

  • статическая переменная int interest_percent, изначально равная 2 и общая для всех счетов
  • статическая переменная int account_count, изначально равная 0; конструктор увеличивает её на 1 для каждого нового счёта
  • describe() возвращает HOLDER: $BALANCE at PERCENT%, используя holder и balance счёта, а также общую переменную interest_percent

Предоставленный код считывает количество следующих счетов и по одной строке holder balance для каждого из них, а затем новую процентную ставку. Он выводит BankAccount.account_count и все счета, задаёт новое значение для BankAccount.interest_percent, а затем снова выводит все счета. Для Alice 1000, Bob 2000 и ставки 3 он выводит:

Accounts opened: 2
Alice: $1000 at 2%
Bob: $2000 at 2%
After the rate change:
Alice: $1000 at 3%
Bob: $2000 at 3%

Ваш код нужно добавить в bank_account.gd. В main.gd находится предоставленный код ввода/вывода; его нельзя редактировать.

Попробуйте сами

extends Node

func _ready():
	# Предоставленный код ввода/вывода: оставьте его без изменений
	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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript