Выбор ответа Middle Функции, расширения и scope-функции спрашивают часто обновлено
Функции расширения разрешаются статически
Вопрос
Что выведет код?
open class Shape
class Circle : Shape()
fun Shape.name() = "shape"
fun Circle.name() = "circle"
val s: Shape = Circle()
println(s.name())
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: shape. Расширение компилируется в статическую функцию, и выбор делается при компиляции по объявленному типу переменной.
Варианты ответа
shapeправильный ответcircle- Ошибка компиляции: конфликт расширений
- Зависит от порядка объявления функций
Разбор
Расширение компилируется в статическую функцию, и выбор делается при компиляции по объявленному типу переменной. У s тип Shape, поэтому вызывается Shape.name(), хотя объект Circle. Полиморфизм работает только для членов класса (open fun и override). Два расширения для разных типов не конфликтуют, порядок объявления не важен.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.