如果存在同名方法的 Mixin,如何调用 Super Class 方法

cre*_*not 8 dart flutter

重复的方法行为

此处作为 Gist代码将打印e. 如果我删除覆盖,即output从 中删除Baz,它将wBar.
这使我得出结论,方法“优先级”是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。如果我交换BarZoo

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方法,如果我也有一个mixindispose方法的方法,它会破坏State的功能,因为mixindispose方法优先,如上所示。

补充说明

super.output也会调用 mixin 方法,这就是为什么它不起作用。您可以尝试将以下构造函数添加到Baz

Baz() {
  super.output();
}
Run Code Online (Sandbox Code Playgroud)

即使这有效,也无济于事,因为disposeFlutter 案例中的方法是从外部调用的。

Rob*_*bin 5

在 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.

想了解更多?详细解说~>