Переменные экземпляра и класса
Часть раздела Объектно-ориентированное программирование путешествия по 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 += 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 AcademyЧитайте статическую переменную через имя класса, например Student.count, без необходимости создавать объект. Внутри класса используйте её имя: count += 1 в _init() учитывает каждого студента, созданного к этому моменту.
Изменение Student.school меняет его сразу для всех учащихся. ada.school = "Night School" сделало бы то же самое, потому что school всего одна; запись имени класса делает это очевидным.
const используется для общего доступа так же, но никогда не может измениться. Используй static var для общих данных, которые меняются во время работы программы, например для счётчика или настройки, которой следуют все объекты.
Задание
ЛегкоДополните класс BankAccount в файле bank_account.gd:
- статическая переменная
intinterest_percent, изначально равная2и общая для всех счетов - статическая переменная
intaccount_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())
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript