此处作为 Gist的代码将打印e. 如果我删除覆盖,即output从 中删除Baz,它将w从Bar.
这使我得出结论,方法“优先级”是own class -> mixin -> super class.
如果我添加更多的mixin,例如这样:
mixin Zoo {
output() {
print('j');
}
}
class Baz extends Foo with Bar, Zoo {
// ...
Run Code Online (Sandbox Code Playgroud)
现在,输出是j。如果我交换Bar和Zoo:
class Baz extends Foo with Zoo, Bar {
// ...
Run Code Online (Sandbox Code Playgroud)
现在,输出w再次出现。
因此,我会这样定义的优先级:own class -> last mixin -> nth-last mixin -> super class。
有什么方法可以让我控制这种行为,即即使 amixin有一个同名的方法也调用超级调用方法?
您可能会问我为什么要这样做,而不仅仅是重命名方法。
好吧,在 Flutter 中 allState都有一个dispose方法,如果我也有一个mixin有dispose方法的方法,它会破坏State的功能,因为mixin的dispose方法优先,如上所示。
super.output也会调用 mixin 方法,这就是为什么它不起作用。您可以尝试将以下构造函数添加到Baz:
Baz() {
super.output();
}
Run Code Online (Sandbox Code Playgroud)
即使这有效,也无济于事,因为disposeFlutter 案例中的方法是从外部调用的。
在 mixins 中 -声明mixin的顺序非常重要。
当你将 mixin 应用到一个类时,
Dart 中的 Mixin 通过创建一个新类来工作,该类将 mixin 的实现分层放在超类之上以创建一个新类 - 它不是“在超类的侧面”而是“在超类的顶部”,因此没有歧义如何解决查找 源
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);
}
Run Code Online (Sandbox Code Playgroud)
AB 和 BA 类都使用 A 和 B 混合扩展了 P 类,但顺序不同。所有三个 A、B 和 P 类都有一个名为 getMessage 的方法。
首先我们调用AB类的getMessage方法,然后调用BA类的getMessage方法。
输出将是BA.
| 归档时间: |
|
| 查看次数: |
1772 次 |
| 最近记录: |