На этом шаге мы рассмотрим способ задания функций класса.
Объявление класса может включать два вида содержимого: поведение и данные. В NyetHack игрок может выполнять разные действия, например, участвовать в битве, перемещаться, произносить заклинание, порождающее бокал дурманящего напитка, или проверять инвентарь. Вы определяете поведение класса, добавляя объявления функции в тело класса. Объявленные внутри класса функции называют функциями класса.
Вы уже определили некоторые действия игрока в Game.kt. Теперь займемся реорганизацией кода, чтобы внести в него элементы, свойственные классу.
Начнем с добавления функции castFireball() в Player.
class Player { fun castFireball(numFireballs: Int = 2) = println("A glass of Fireball springs into existence. (x$numFireballs)") }
Рис.1. Объявление функции класса (Player.kt)
Здесь вы объявили тело класса Player, добавив фигурные скобки. Тело класса содержит определения поведения и данных класса по аналогии с тем, как поведение функции определяется в ее теле.
В Game.kt удалите определение castFireball() и добавьте вызов функции класса в main().
fun main() { val name = "Madrigal" 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, name, healthStatus) } . . . .
Рис.2. Вызов функции класса (Game.kt)
Группировка логики по "объектам" с использованием классов помогает сохранить код организованным в процессе его развития. С ростом NyetHack вы добавите еще больше классов, каждый из которых будет иметь свои обязанности.
Запустите Game.kt и убедитесь, что игрок получил стакан дурманящего напитка.
Рис.3. Результат работы приложения
Зачем перемещать castFireball() в Player? В NyetHack заклинание для получения дурманящего напитка произносится игроком: этот напиток нельзя получить без экземпляра Player, и бокал с этим напитком создается конкретным игроком, который вызвал castFireball(). Объявление castFireball() как функции класса, которая вызывается для конкретного экземпляра класса, отражает эту логику. Далее мы переместим и другие функции, связанные с игроком в NyetHack, в класс Player.
На следующем шаге мы рассмотрим доступность и инкапсуляцию.