Шаг 187.
Основы Kotlin.
Объекты. Перечисления

    На этом шаге мы рассмотрим назначение и правила их использования.

    Перечисления, или enum, - это специальный тип класса, полезный для объявления коллекции констант, известных как перечисляемые типы.

    В NyetHack вы будете использовать перечисление для представления множества из четырех доступных для движения игрока направлений, то есть четырех сторон света. Для этого добавим перечисление с именем Direction в Navigator.kt.

enum class Direction {
    NORTH,
    EAST,
    SOUTH,
    WEST
}


Рис.1. Объявление перечисления (Navigator.kt)

    Перечисления более описательны, чем другие типы констант, например строки. Ссылайтесь на перечисляемые типы, используя имя класса перечисления, точку и имя типа, например вот так:

  Direction.EAST

    Перечисления могут выражать больше, чем просто именованные константы. Чтобы использовать Direction для представления направления движения в NyetHack, определите для каждого типа в Direction соответствующее изменение Coordinate, когда игрок сделает шаг.

    Движение в мире должно изменять координаты х и у игрока в соответствии с направлением движения. Например, если игрок делает шаг на восток, координата х должна увеличиться на 1, а y - на 0. Если игрок делает шаг на юг, координата х должна увеличиться на 0, а у - на 1.

    Добавьте в перечисление Direction главный конструктор, объявляющий свойство coordinate. Так как вы добавили параметр в конструктор перечисления, вам придется вызвать его в объявлении каждого перечисленного типа в Direction и передать соответствующее значение Coordinate.

enum class Direction(private val coordinate: Coordinate) {
    NORTH(Coordinate(0, -1)),
    EAST(Coordinate(1, 0)),
    SOUTH(Coordinate(0, 1)),
    WEST(Coordinate(-1, 0))
}


Рис.2. Объявление конструктора enum (Navigator.kt)

    Перечисления, как и другие классы, могут содержать объявления функций.

    Добавьте функцию с именем updateCoordinate() в Direction, которая будет изменять положение игрока в зависимости от его направления движения (обратите внимание: вам нужно добавить точку с запятой, отделяющую объявления типов перечисления от объявления функции).

enum class Direction(private val coordinate: Coordinate) {
    NORTH(Coordinate(0, -1)),
    EAST(Coordinate(1, 0)),
    SOUTH(Coordinate(0, 1)),
    WEST(Coordinate(-1, 0))

    fun updateCoordinate(playerCoordinate: Coordinate) =
            Coordinate(playerCoordinate.x + coordinate.x,
                    playerCoordinate.y + coordinate.y)
}
Файл с проектом можно взять здесь.


Рис.3. Объявление функции в перечислении (Navigator.kt)

    Функции должны вызываться для перечисляемых типов, а не для самого класса перечисления, поэтому вызов updateCoordinate() будет выглядеть так:

  Direction.EAST.updateCoordinate(Coordinate(1, 0))

    На следующем шаге мы рассмотрим перегрузку операторов.




Предыдущий шаг Содержание Следующий шаг