На этом шаге мы рассмотрим назначение ключевого слова 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)
На следующем шаге мы продолжим изучение этого вопроса.