На этом шаге мы рассмотрим особенности задания свойств класса.
Функции класса описывают его поведение. Определения данных, чаще называемые свойствами класса, - это атрибуты, необходимые для выражения определенного состояния или характеристик класса. Например, свойства класса Player могут представлять имя игрока, состояние здоровья, расу, мировоззрение, пол и прочее.
На данный момент имя игрока объявляется в функции main(), но ваш класс лучше подойдет для хранения такой информации. Обновите код Player.kt, добавив свойство name.
class Player { val name = "Madrigal" fun castFireball(numFireballs: Int = 2) = println("A glass of Fireball springs into existence. (x$numFireballs)") }
Рис.1. Определение свойства name (Player.kt)
Вы добавили свойство name в тело класса Player, включая его как актуальное значение для экземпляра Player. Обратите внимание, что name объявлено как val. Как и переменные, свойства могут объявляться с ключевыми словами var и val, чтобы позволить или не позволить изменять информацию, хранимую в них. Про изменяемость свойств мы поговорим позже в следующих шагах.
Теперь удалите объявление name из Game.kt.
Рис.2. Удаление name из main() (Game.kt)
Вы могли заметить, что IntelliJ теперь предупреждает о проблеме с Game.kt (рисунок 3).
Рис.3. Неразрешенная ссылка
Теперь, когда name принадлежит Player, надо обновить printPlayerStatus(), чтобы получить имя из экземпляра класса Player. Используйте синтаксис с точкой, чтобы передать свойство name переменной player в printPlayerStatus().
fun main() { var healthPoints = 89 val isBlessed = true val isImmortal = false val player = Player() player.castFireball() // Аура val auraColor = auraColor(isBlessed, healthPoints, isImmortal) val healthStatus = formatHealthStatus(healthPoints, isBlessed) // Состояние игрока printPlayerStatus(auraColor, isBlessed, player.name, healthStatus) } . . . .
Рис.4. Получение ссылки на свойство name класса Player (Game.kt)
Запустите Game.kt. Состояние игрока, включая имя, выводится в таком же виде, как и раньше, но теперь вы получили доступ к свойству name через экземпляр класса Player, а не через локальную переменную в main().
Рис.5. Результат работы приложения
Когда создается экземпляр класса, все его свойства должны получить значения. Это значит, что, в отличие от переменных, свойствам класса обязательно должны присваиваться начальные значения. Например, следующий код недопустим, так как name объявляется без начального значения:
class Player { val name fun castFireball(numFireballs: Int = 2) = println("A glass of Fireball springs into existence. (x$numFireballs)") }
Мы изучим подробности инициализации классов и свойств в следующем разделе.
В следующих шагах мы займемся рефакторингом NyetHack и переместим остальные данные, принадлежащие классу Player, в объявление этого класса.
На следующем шаге мы рассмотрим методы свойств.