Mixin黯然失色

JAr*_*Are 6 dart

假设我有这样的代码:

class A{ foo() => "A";}
class B{ foo() => "B";}
class C{ foo() => "C";}

class Mix extends A with B,C {
  foo() => "MIX";
  bar() => super.foo();
}

class MessABC = Object with A,B,C;
class MessBCA = Object with B,C,A;
class MessCAB = Object with C,A,B;

void main() {
  Mix mix = new Mix();
  MessABC mABC = new MessABC();
  MessBCA mBCA = new MessBCA();
  MessCAB mCAB = new MessCAB();

  print("Mix.foo = ${mix.foo()} Mix.bar = ${mix.bar()} \n"
        "mABC.foo = ${mABC.foo()} \n"
        "mBCA.foo = ${mBCA.foo()} \n"
        "mCAB.foo = ${mCAB.foo()} \n");

}
Run Code Online (Sandbox Code Playgroud)

输出

Mix.foo = MIX Mix.bar = C
mABC.foo = C
mBCA.foo = A
mCAB.foo = B

mix对象我可以调用这两个Mix.fooC.foo (其实我预期A.foo) ,但我可以以某种方式实现 A.fooB.foo

另外我有点被混淆语义.A,B,C看起来像"一级枚举",但顺序很重要.而"Dart编辑器"并没有警告我名字冲突.也许我可以启用此警告?

对我来说,这感觉就像是让你感到困惑和容易出错的东西.

lrn*_*lrn 7

Mixin应用程序从左到右处理.

的超类Object with A,B,CObject with A,B,这又具有超Object with A然后Object.

mixin的首要规则与非mixin超类相同.您C.fooMix覆盖从继承而来的AB,这样Mix.barsuper.foo()只达到了C.foo,有没有办法访问A.fooB.foo.

覆盖是完全正常的,并且不会引起任何警告,只要这些方法具有兼容的签名即可.

对mixin最全面的描述仍然是https://www.dartlang.org/articles/mixins/