Выбор ответа Senior Делегаты обновлено

Делегат не видит переопределений обёртки

Вопрос

Что выведет код?

interface Greeter { fun name(): String; fun hello() }

class Base : Greeter {
    override fun name() = "base"
    override fun hello() = println(name())
}

class Wrapper(b: Greeter) : Greeter by b {
    override fun name() = "wrapped"
}

fun main() { Wrapper(Base()).hello() }

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: base. Делегирование это не наследование.

Варианты ответа

  1. wrapped
  2. wrapped base
  3. Ошибка компиляции
  4. baseправильный ответ

Разбор

Делегирование это не наследование. Wrapper.hello() переадресуется в base.hello(), а внутри Base вызов name() идёт на this самого Base, который ничего не знает об обёртке. Переопределённый в Wrapper метод name() вызовется, только если звать его на объекте обёртки. При наследовании от open class был бы полиморфизм и вывод wrapped.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.