Menu
CoddyTech

Геттеры свойств

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

Блок get:, геттер свойства, выполняется каждый раз при чтении свойства, а возвращаемое им значение — это значение, которое получает читатель. Используй его для значения, вычисляемого из других свойств:

# rectangle.gd
var width: int = 4
var height: int = 3
var area: int:
	get:
		return width * height
var r := Rectangle.new()
print(r.area) # 12
r.width = 10
print(r.area) # 30

r.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 / 9
t.celsius = 25.0
print(t.fahrenheit) # 77.0
t.fahrenheit = 98.6
print(t.celsius) # 37.0

Свойство, у которого есть только get:, по соглашению доступно только для чтения. Присваивание ему значения не приводит к ошибке, но геттер игнорирует присвоенное значение: после r.area = 100 r.area по-прежнему возвращает 30.

challenge icon

Задание

Легко

Заверши класс Temperature в файле temperature.gd. Он хранит одно значение — celsius — и вычисляет по нему значения для других шкал:

  • fahrenheit: геттер возвращает celsius * 9 / 5 + 32, а сеттер сохраняет (value - 32) * 5 / 9 в celsius
  • kelvin: свойство только для чтения, геттер которого возвращает 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])
quiz iconПроверьте себя

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

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

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