Выбор ответа Senior Dart: классы и миксины обновлено
Dart: расширения разрешаются статически
Вопрос
Что выведет код?
class Dog { String hello() => 'class'; }
extension on Object { String hello() => 'ext'; }
void main() {
Object x = Dog();
print(x.hello());
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: ext. Метод расширения выбирается по статическому типу переменной.
Варианты ответа
extправильный ответclass- Ошибка компиляции: метод
helloуже есть уObject - Ошибка в рантайме:
NoSuchMethodError
Разбор
Метод расширения выбирается по статическому типу переменной. У x объявлен тип Object, в Object нет hello, значит берётся расширение on Object, хотя реальный объект Dog имеет свой hello. Члены самого класса побеждают расширения только тогда, когда видны по статическому типу. По этой же причине расширения не работают на dynamic.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Dart: переопределение == без hashCode
Следующий вопрос
Dart: зачем нужен factory-конструктор