Выбор ответа 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. Делегирование это не наследование.
Варианты ответа
wrappedwrapped base- Ошибка компиляции
baseправильный ответ
Разбор
Делегирование это не наследование. Wrapper.hello() переадресуется в base.hello(), а внутри Base вызов name() идёт на this самого Base, который ничего не знает об обёртке. Переопределённый в Wrapper метод name() вызовется, только если звать его на объекте обёртки. При наследовании от open class был бы полиморфизм и вывод wrapped.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.