如果存在具有相同名称的方法的Mixin,

时间:2019-07-15 08:12:55

标签: flutter dart

方法行为重复

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。如果我绕过BarZoo

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(); } 方法是从外部调用的。

1 个答案:

答案 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

Want to learn more ? Details Explanation ~>