Переопределение метода mixin в Dart
Метод класса может перекрыть одноименный метод
mixin. Тогда у объекта сработает версия из
класса. Чтобы явно дополнить поведение mixin,
внутри метода класса вызывают super.show().
Класс Post с mixin Helper
добавит вывод заголовка после базовой команды:
mixin Helper {
void show() {
print("note");
}
}
class Post with Helper {
String title = "";
@override
void show() {
super.show();
print(title);
}
}
Создадим объект, заполним поля и проверим результат:
var post = Post();
post.title = "hello";
post.show();
Если в классе и в mixin есть метод с одним
именем, без @override в теле класса
все равно победит метод класса. Mixin остается
доступен через super, если вы его
вызываете сами.
При наследовании метод mixin имеет приоритет над одноименным методом родителя, если класс сам метод не переопределяет:
mixin TestTrait {
String method() {
return "mixin";
}
}
class ParentPost {
String method() {
return "parent";
}
}
class Post extends ParentPost with TestTrait {}
Создадим объект и вызовем метод:
var post = Post();
print(post.method());
Когда два mixin дают один метод, порядок
в with решает конфликт: правый mixin
замещает левый. Две версии одного метода
одновременно не доступны - меняют порядок
with или переопределяют метод в классе:
mixin Helper1 {
int value() {
return 1;
}
}
mixin Helper2 {
int value() {
return 2;
}
}
class Employee with Helper1, Helper2 {
int getSum() {
return value();
}
}
Создадим объект и вызовем метод:
var emp = Employee();
print(emp.getSum());
Сделайте mixin Helper1, Helper2
и TestTrait с одним методом value,
возвращающим 1, 2 и 3.
Подключите их к Employee и выведите
результат value. Затем поменяйте
порядок mixin и сравните вывод.
Сделайте mixin Helper1, Helper2
и TestTrait с методами part1,
part2 и part3. Класс
Employee подключит все три mixin,
а метод getSum вернет сумму
трех частей.