Шаг 137.
Основы Kotlin.
Объявление классов. Свойства класса

    На этом шаге мы рассмотрим особенности задания свойств класса.

    Функции класса описывают его поведение. Определения данных, чаще называемые свойствами класса, - это атрибуты, необходимые для выражения определенного состояния или характеристик класса. Например, свойства класса Player могут представлять имя игрока, состояние здоровья, расу, мировоззрение, пол и прочее.

    На данный момент имя игрока объявляется в функции main(), но ваш класс лучше подойдет для хранения такой информации. Обновите код Player.kt, добавив свойство name.


Значение 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, в объявление этого класса.

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




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