На этом шаге мы рассмотрим назначение и использование таких классов.
Первый шаг на пути построения мира для вашего героя - это создание системы координат для перемещения. Система координат будет использовать основные направления движения, а также класс с именем Coordinate для представления изменения направления.
Coordinate - простой тип и потенциальный кандидат для объявления в роли класса данных. Как можно понять из названия, классы данных спроектированы специально для хранения данных и предлагают широкие возможности для работы с данными, как вы вскоре увидите.
Создайте новый файл Navigation.kt и добавьте в него Coordinate как класс данных, используя ключевое слово data. У Coordinate должны быть три свойства:
data class Coordinate(val x: Int, val y: Int) { val isInBounds = x >= 0 && y >= 0 }
Рис.1. Объявление класса данных (Navigation.kt)
У координат никогда не должно быть значения меньше 0, поэтому вы добавляете свойство классу, которое следит за тем, чтобы их значения не выходили за допустимые границы. Позже мы будем проверять свойство isInBounds перед обновлением currentRoom, чтобы убедиться, что Coordinate представляет допустимое направление для перемещения. Например, если игрок, находясь у верхнего края карты, попытается переместиться вверх, то проверка isInBounds должна это предотвратить.
Чтобы отслеживать положение игрока на карте мира, добавьте свойство с именем currentPosition в класс Player.
import com.bignerdranch.nyethack.Coordinate import java.io.File class Player (_name: String, var healthPoints: Int = 100, val isBlessed: Boolean, private val isImmortal: Boolean) { var name = _name get() = "${field.capitalize()} of $hometown" private set(value) { field = value.trim() } init { require(healthPoints > 0, { "healthPoints must be greater than zero." }) require(name.isNotBlank(), { "Player must have a name." }) } val hometown by lazy { selectHometown() } var currentPosition = Coordinate(0, 0) . . . . }
Рис.2. Отслеживание позиции игрока (Player.kt)
На 170 шаге вы узнали, что все классы в Kotlin являются потомками одного класса - Any. Объявленные в Any функции можно вызвать для любого экземпляра. К ним относятся toString(), equals() и hashCode(), которые увеличивают скорость получения значения по ключу при использовании ассоциативного массива.
Any обеспечивает реализацию по умолчанию этих функций, но как вы уже могли заметить, они не всегда удобны. Классы данных предлагают свои реализации этих функций, которые могут лучше соответствовать потребностям вашего проекта. Далее мы поговорим о двух из них, а также о некоторых других преимуществах использования классов данных для представления данных в вашем коде.
На следующем шаге мы рассмотрим функцию toString().