На этом шаге мы рассмотрим одну задачу и прокомментируем ее решение.
Задание: загадка Экскалибура
Вы узнали, что для свойства можно определить свои методы чтения и записи. Теперь, когда вы знаете, как инициализируются свойства и их классы, у нас есть для вас загадка.
У каждого великого меча есть имя. Объявите класс с именем Sword в Kotlin REPL, который подтверждает это.
class Sword(_name: String) { var name = _name get() = "The Legendary $field" set(value) { field = value.toLowerCase().reversed().capitalize() } }
Рис.1. Объявление Sword (REPL)
Что выведет следующий код, который создает экземпляр Sword и обращается к свойству name? (Попробуйте ответить до того, как проверите в REPL.)
val sword = Sword("Excalibur") println(sword.name)
Рис.2. Ссылка на name (REPL)
Раскрыть/скрыть решение и комментарии.
Что выведет следующий код после изменения name?
sword.name = "Gleipnir" println(sword.name)
Раскрыть/скрыть решение и комментарии.
И наконец, добавьте блок инициализации в Sword, который инициализирует name.
class Sword(_name: String) { var name = _name get() = "The Legendary $field" set(value) { field = value.toLowerCase().reversed().capitalize() } init { name = _name } }
Рис.5. Добавление блока инициализации (REPL)
Что выведет следующий код теперь, после создания экземпляра Sword и обращения к name?
val sword = Sword("Excalibur") println(sword.name)
Раскрыть/скрыть решение и комментарии.
Это задание проверит ваши знания об инициализации и пользовательских методах чтения и записи свойств.
Со следующего шага мы начнем знакомиться с наследованием.