在this article about Dart Mixins,底部有一个例子:
class S {
twice(int x) => 2 * x;
}
abstract class I {
twice(x);
}
abstract class J {
thrice(x);
}
class K extends S implements I, J {
int thrice(x) => 3* x;
}
class B {
twice(x) => x + x;
}
class A = B with K;
文章接着说:
现在,当我们定义A时,我们从K的mixin中获得了thice()的实现。但是,mixin不会为我们提供两次()的实现。幸运的是,B确实有这样的实现,所以整体A确实满足I,J和S的要求。
我不自然,为什么B
需要实施twice
。为什么K
的thrice
实现应用于B
但其继承的twice
实现不适用?
(请注意,链接的文章已过时,不适用于Dart 2.)
mixins背后的想法是“mixin”是一个类和它的超类之间的区别。
对于类K
,这个区别是在extends子句之后的声明中的所有内容:
implements I, J {
int thrice(x) => 3* x;
}
然后,当你通过将mixin应用到另一个类A
(作为B
)创建一个新类class A = B with K;
时,结果类基本上变为:
class A extends B implements I, J {
int thrice(x) => 3* x;
}
该类实现接口I
和J
,并且具有从twice
继承的B
方法和从thrice
混合的K
方法。
(这个例子是无效的Dart 2.在Dart 2中,你不能从类声明中提取一个除了Object
之外的超类的接口。要声明一个具有超类概念的mixin,你必须使用mixin
宣言:
mixin K on S implements I, J {
int thrice(int x) => 3* x;
}
class B implements S {
int twice(int x) => 2 * x;
}
class A = B with K;
).