【发布时间】:2019-11-23 22:02:09
【问题描述】:
重复的方法行为
code, here as a Gist, 将打印 e。如果我删除覆盖,即从Baz 删除output,它将从Bar 打印w。
这使我得出结论,方法“优先级”是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 的dispose 方法优先,如上图所示。
补充说明
super.output 也会调用 mixin 方法,这就是它不起作用的原因。您可以尝试将以下构造函数添加到Baz:
Baz() {
super.output();
}
即使这样可行,也无济于事,因为 Flutter 案例中的 dispose 方法是从外部调用的。
【问题讨论】:
-
这根本不可能。无论如何,在小部件中广泛使用 mixin 通常不是一件好事。它们的可扩展性不是很好