KT Kotlin  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Наследование и интерфейсы

Наследование проверяется через open, override, интерфейсы с реализацией и абстрактные классы. Нужно определить, какая версия метода будет вызвана, где возникает конфликт реализаций и когда композиция выражает связь точнее, чем иерархия.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 4 тематических шкал.
Вопрос 1 из 20
Какой соседний случай отличает устойчивое решение «Свойство и реализация интерфейса» от удачного примера?
Вопрос 2 из 20
В «Шаблонный метод в abstract class» выбрали решение: Выбирать абстрактный класс, когда реализации действительно делят состояние или жизненный цикл, а не только сигнатуры операций. Какова его реальная цена?
Вопрос 3 из 20
Что в семантике Kotlin или используемого API объясняет «Динамический доступ к open-свойству»?
KotlinОткрытые классы и методы · Динамический доступ к open-свойству
// На ревью требуется объяснить причину поведения.
open class Base {
    open val name: String = "base"
    fun label() = "[$name]"
}
class Child : Base() {
    override val name = "child"
}
fun main() = println(Child().label())
Вопрос 4 из 20
Какое изменение лучше всего защищает границу «Виртуальный вызов override»?
KotlinПереопределение override · Виртуальный вызов override
// Сохраните назначение фрагмента, но укрепите его контракт.
open class Formatter {
    open fun format(x: Int): String = "n=$x"
}
class HexFormatter : Formatter() {
    override fun format(x: Int): String = x.toString(16)
}
fun main() {
    val f: Formatter = HexFormatter()
    println(f.format(31))
}
Вопрос 5 из 20
Чем завершится выполнение «Шаблонный метод в abstract class»?
KotlinАбстрактные классы · Шаблонный метод в abstract class
// Проследите фактическое выполнение без изменения кода.
abstract class Metric {
    abstract fun value(): Int
    fun doubled() = value() * 2
}
class Fixed(private val n: Int) : Metric() {
    override fun value() = n
}
fun main() = println(Fixed(6).doubled())
Вопрос 6 из 20
Как укрепить «Динамический доступ к open-свойству», не переписывая соседние модули?
KotlinОткрытые классы и методы · Динамический доступ к open-свойству
// Сохраните назначение фрагмента, но укрепите его контракт.
open class Base {
    open val name: String = "base"
    fun label() = "[$name]"
}
class Child : Base() {
    override val name = "child"
}
fun main() = println(Child().label())
Вопрос 7 из 20
На каком входе или состоянии граница «Виртуальный вызов override» становится заметной?
Вопрос 8 из 20
Какой риск не исчезает после правки «Свойство и реализация интерфейса»: Разделять небольшие ролевые интерфейсы и не заставлять реализации зависеть от методов, которые им не нужны?
Вопрос 9 из 20
Какой пограничный сценарий обязательно добавить к проверкам «Динамический доступ к open-свойству»?
Вопрос 10 из 20
Какую обратную сторону имеет решение для «Виртуальный вызов override»: Сохранять предусловия и смысл базового контракта, а отличия поведения проверять тестами через ссылку базового типа?
Вопрос 11 из 20
Чем завершится выполнение «Свойство и реализация интерфейса»?
KotlinИнтерфейсы · Свойство и реализация интерфейса
// Проследите фактическое выполнение без изменения кода.
interface Named { val name: String }
interface Tagged { fun tag() = "tag" }
class Item(override val name: String) : Named, Tagged
fun main() = println(Item("book").name + ":" + Item("book").tag())
Вопрос 12 из 20
Какой контракт снимает спор о причине поведения «Шаблонный метод в abstract class»?
KotlinАбстрактные классы · Шаблонный метод в abstract class
// На ревью требуется объяснить причину поведения.
abstract class Metric {
    abstract fun value(): Int
    fun doubled() = value() * 2
}
class Fixed(private val n: Int) : Metric() {
    override fun value() = n
}
fun main() = println(Fixed(6).doubled())
Вопрос 13 из 20
Как поведёт себя фрагмент «Виртуальный вызов override» при указанных входных данных?
KotlinПереопределение override · Виртуальный вызов override
// Проследите фактическое выполнение без изменения кода.
open class Formatter {
    open fun format(x: Int): String = "n=$x"
}
class HexFormatter : Formatter() {
    override fun format(x: Int): String = x.toString(16)
}
fun main() {
    val f: Formatter = HexFormatter()
    println(f.format(31))
}
Вопрос 14 из 20
Почему поведение «Свойство и реализация интерфейса» не является случайностью?
KotlinИнтерфейсы · Свойство и реализация интерфейса
// На ревью требуется объяснить причину поведения.
interface Named { val name: String }
interface Tagged { fun tag() = "tag" }
class Item(override val name: String) : Named, Tagged
fun main() = println(Item("book").name + ":" + Item("book").tag())
Вопрос 15 из 20
Какая правка устраняет причину риска в «Шаблонный метод в abstract class», а не только его проявление?
KotlinАбстрактные классы · Шаблонный метод в abstract class
// Сохраните назначение фрагмента, но укрепите его контракт.
abstract class Metric {
    abstract fun value(): Int
    fun doubled() = value() * 2
}
class Fixed(private val n: Int) : Metric() {
    override fun value() = n
}
fun main() = println(Fixed(6).doubled())
Вопрос 16 из 20
Какой побочный эффект существеннее остальных после правки «Динамический доступ к open-свойству»: Открывать для переопределения небольшой документированный контракт, а не весь класс ради единичного варианта поведения?
Вопрос 17 из 20
Какое изменение лучше всего защищает границу «Свойство и реализация интерфейса»?
KotlinИнтерфейсы · Свойство и реализация интерфейса
// Сохраните назначение фрагмента, но укрепите его контракт.
interface Named { val name: String }
interface Tagged { fun tag() = "tag" }
class Item(override val name: String) : Named, Tagged
fun main() = println(Item("book").name + ":" + Item("book").tag())
Вопрос 18 из 20
Где упрощённое объяснение «Шаблонный метод в abstract class» перестаёт работать?
Вопрос 19 из 20
Чем завершится выполнение «Динамический доступ к open-свойству»?
KotlinОткрытые классы и методы · Динамический доступ к open-свойству
// Проследите фактическое выполнение без изменения кода.
open class Base {
    open val name: String = "base"
    fun label() = "[$name]"
}
class Child : Base() {
    override val name = "child"
}
fun main() = println(Child().label())
Вопрос 20 из 20
Почему поведение «Виртуальный вызов override» не является случайностью?
KotlinПереопределение override · Виртуальный вызов override
// На ревью требуется объяснить причину поведения.
open class Formatter {
    open fun format(x: Int): String = "n=$x"
}
class HexFormatter : Formatter() {
    override fun format(x: Int): String = x.toString(16)
}
fun main() {
    val f: Formatter = HexFormatter()
    println(f.format(31))
}

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу