Геттеры свойств
Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 12 из 65.
Блок get:, геттер свойства, выполняется каждый раз при чтении свойства, а возвращаемое им значение — это значение, которое получает читатель. Используй его для значения, вычисляемого из других свойств:
# rectangle.gd
var width: int = 4
var height: int = 3
var area: int:
get:
return width * heightvar r := Rectangle.new()
print(r.area) # 12
r.width = 10
print(r.area) # 30r.area считывается как переменная, без скобок, но вычисляется заново при каждом считывании, поэтому всегда соответствует текущим ширине и высоте.
У свойства могут быть оба блока. Здесь fahrenheit выполняет только преобразование: при чтении оно преобразует значение из celsius, а при присваивании преобразует его обратно и сохраняет результат в celsius:
# temperature.gd
var celsius: float = 0.0
var fahrenheit: float:
get:
return celsius * 9 / 5 + 32
set(value):
celsius = (value - 32) * 5 / 9t.celsius = 25.0
print(t.fahrenheit) # 77.0
t.fahrenheit = 98.6
print(t.celsius) # 37.0Свойство, у которого есть только get:, по соглашению доступно только для чтения. Присваивание ему значения не приводит к ошибке, но геттер игнорирует присвоенное значение: после r.area = 100 r.area по-прежнему возвращает 30.
Задание
ЛегкоЗаверши класс Temperature в файле temperature.gd. Он хранит одно значение — celsius — и вычисляет по нему значения для других шкал:
fahrenheit: геттер возвращаетcelsius * 9 / 5 + 32, а сеттер сохраняет(value - 32) * 5 / 9вcelsiuskelvin: свойство только для чтения, геттер которого возвращаетcelsius + 273.15
Предоставленный код считывает количество команд, а затем считывает по одной команде в каждой строке: c VALUE задаёт значение celsius, а f VALUE — fahrenheit. После каждой команды он выводит значения трёх свойств с двумя знаками после запятой. Для c 25, f 98.6 и c -40 он выводит:
25.00 C | 77.00 F | 298.15 K
37.00 C | 98.60 F | 310.15 K
-40.00 C | -40.00 F | 233.15 KТвой код нужно поместить в temperature.gd. В main.gd находится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
extends Node
func _ready():
# Предоставленный код ввода/вывода: оставьте его без изменений
var temp := Temperature.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "c":
temp.celsius = float(parts[1])
else:
temp.fahrenheit = float(parts[1])
print("%.2f C | %.2f F | %.2f K" % [temp.celsius, temp.fahrenheit, temp.kelvin])
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript