Что такое миксины в Dart
Что проверяют
Знаете ли вы механизмы переиспользования кода в Dart помимо наследования и понимаете ли, как язык разрешает конфликты, когда к классу подмешано несколько миксинов. Вопрос почти всегда всплывает на Flutter-собеседовании, потому что во фреймворке миксины встречаются на каждом шагу.
Как отвечать
Миксин это отдельная декларация, объявляемая ключевым словом mixin и подключаемая через with. Он даёт классу методы и поля без наследования, поэтому один класс может собрать поведение из нескольких источников. Конструктора у миксина нет, и это единственное серьёзное ограничение по сравнению с обычным классом.
Ключевая деталь, которую ждут: ограничение on. Оно задаёт тип, к которому миксин применим, и открывает доступ к его членам и к super.
mixin Analytics on State {
void track(String event) {
debugPrint('$event: ${widget.runtimeType}');
}
}
class _CartState extends State<Cart> with Analytics {
@override
void initState() {
super.initState();
track('cart_opened');
}
}Скажите про линеаризацию: миксины применяются слева направо, каждый следующий накладывается поверх предыдущего, и при совпадении имён побеждает правый. Отсюда же работает super внутри миксина: он указывает не на родителя класса, а на предыдущее звено цепочки.
Где спотыкаются
Утверждают, что миксин не может хранить состояние. Может: поля объявляются как в обычном классе, и знакомый всем ticker provider из Flutter хранит своё. Нельзя другое, а именно конструктор и параметры инициализации.
Не знают про on и лепят миксин без ограничения, а внутри зовут методы конкретного класса. Компилятор такой код не примет, а попытка обойти через динамику превращает ошибку сборки в падение в рантайме.
Подмешивают два миксина с одинаковым именем метода и удивляются, что вызывается не тот. Перекрытие происходит тихо, без предупреждения, поэтому порядок в with это часть контракта, а не оформление.