假设我有这样的代码:
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.foo
和C.foo
与超 (其实我预期A.foo
)
,但我可以以某种方式实现 A.foo
和B.foo
?
另外我有点被混淆与语义.A,B,C
看起来像"一级枚举",但顺序很重要.而"Dart编辑器"并没有警告我名字冲突.也许我可以启用此警告?
对我来说,这感觉就像是让你感到困惑和容易出错的东西.
Mixin应用程序从左到右处理.
的超类Object with A,B,C
是Object with A,B
,这又具有超Object with A
然后Object
.
mixin的首要规则与非mixin超类相同.您C.foo
在Mix
覆盖从继承而来的A
和B
,这样Mix.bar
的super.foo()
只达到了C.foo
,有没有办法访问A.foo
或B.foo
.
覆盖是完全正常的,并且不会引起任何警告,只要这些方法具有兼容的签名即可.
对mixin最全面的描述仍然是https://www.dartlang.org/articles/mixins/
归档时间: |
|
查看次数: |
220 次 |
最近记录: |