code, here as a Gist,将打印e
。如果我删除覆盖,即从output
中删除Baz
,它将从w
中打印Bar
。
这使我得出结论,方法“优先级”为own class
->
mixin
->
super class
。
如果我添加更多mixin,例如像这样:
mixin Zoo {
output() {
print('j');
}
}
class Baz extends Foo with Bar, Zoo {
// ...
现在,输出为j
。如果我绕过Bar
和Zoo
:
class Baz extends Foo with Zoo, Bar {
// ...
现在,起点再次为w
。
因此,我将这样定义优先级:own class
->
last mixin
->
nth-last mixin
->
super class
。
我有什么办法可以控制这种行为,即即使mixin
的方法具有相同的名称,也要调用超级调用方法?
您可能想知道为什么我要这样做,而不仅仅是重命名方法。
好吧,在Flutter中,所有State
都有一个dispose
方法,如果我有一个mixin
也有dispose
方法,它将破坏State
的功能,因为如上所述,mixin
的{{1}}方法具有优先权。
dispose
也将调用mixin方法,这就是为什么该方法不起作用。您可以尝试将以下构造函数添加到super.output
:
Baz
即使这样行之有效,也无济于事,因为Flutter案例中的Baz() {
super.output();
}
方法是从外部调用的。
答案 0 :(得分:0)
在混合包中-声明混合包的顺序非常重要。
将mixin应用于课程时,
Dart中的Mixins通过创建一个新类来工作,该类将mixin的实现层放在超类之上,以创建一个新类-它不是超类的“侧面”,而是“上层”,因此在解析查询方面毫不含糊 source
class A {
String getMessage() => 'A';
}
class B {
String getMessage() => 'B';
}
class P {
String getMessage() => 'P';
}
class AB extends P with A, B {}
class BA extends P with B, A {}
void main() {
String result = '';
AB ab = AB();
result += ab.getMessage();
BA ba = BA();
result += ba.getMessage();
print(result);
}
AB类和BA类都使用A和B混合来扩展P类,但是顺序不同。 A,B和P这三个类都有一个名为getMessage的方法。
首先,我们调用AB类的getMessage方法,然后调用BA类的getMessage方法。
输出将为BA
。