Шаг 166.
Основы Kotlin.
Наследование. Создание подкласса (продолжение)

    На этом шаге мы рассмотрим назначение ключевого слова protected.

    На 136 шаге вы узнали, как управлять видимостью свойств и функций, используя модификаторы видимости. Свойства и функции по умолчанию общедоступны. Вы также можете сделать их доступными только внутри класса, в котором они объявлены, установив уровень видимости private.

    Модификатор доступа protected - это третий вариант, ограничивающий область видимости члена класса самим классом и любыми его подклассами. Добавьте свойство с модификатором protected и именем dangerLevel в Room.

open class Room(val name: String) {
    protected open val dangerLevel = 5

    fun description() = "Room: $name\n" +
                               "Danger level: $dangerLevel"
    open fun load() = "Nothing much to see here..."
}

class TownSquare : Room("Town Square")  {
    override fun load() = "The villagers rally and cheer as you enter!"
}


Рис.1. Объявление свойства с модификатором protected (Room.kt)

    Свойство dangerLevel определяет уровень опасности комнаты по шкале от 1 до 10. Он выводится в консоль, чтобы игрок видел, какой уровень опасности будет ожидать его в каждой из комнат. Средний показатель опасности равняется 5, поэтому данное значение присваивается по умолчанию в классе Room.

    Подклассы Room могут изменять dangerLevel, чтобы выразить, насколько опасна (или не очень) конкретная комната, но в целом свойство dangerLevel должно быть доступно только в Room и его подклассах. Это идеальный случай для использования ключевого слова protected: вы хотите предоставить доступ к свойству только классу, в котором оно объявлено, и его подклассам.

    Чтобы переопределить свойство dangerLevel в TownSquare, нужно использовать ключевое слово override, как в случае с функцией load().

    Уровень опасности городской площади в NyetHack на три пункта меньше среднего. Чтобы выразить эту логику, нужна возможность сослаться на средний уровень опасности в Room. Можно сослаться на класс суперкласса, используя ключевое слово super. Оно открывает доступ ко всем функциям и свойствам с уровнем видимости public или protected, а в нашем случае - к dangerLevel.

    Переопределите dangerLevel в TownSquare, чтобы сделать уровень угрозы на городской площади на три пункта ниже среднего.

open class Room(val name: String) {
    protected open val dangerLevel = 5

    fun description() = "Room: $name\n" +
                               "Danger level: $dangerLevel"
    open fun load() = "Nothing much to see here..."
}

class TownSquare : Room("Town Square")  {
    override val dangerLevel = super.dangerLevel - 3

    override fun load() = "The villagers rally and cheer as you enter!"
}
Файл с проектом можно взять здесь.


Рис.2. Переопределение dangerLevel (Room.kt)

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




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