在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的中获得thrice()的实现 mixin。但是,mixin无法为我们提供 两次()。幸运的是,B确实有这样的实现,所以总体A 确实满足I,J和S的要求。
我不理解为什么 B
需要实现twice
。为什么将K
的{{1}}实现应用于thrice
,却不能继承其B
的实现?
答案 0 :(得分:1)
(请注意,链接的文章已过时,不适用于Dart 2。)
mixin背后的想法是“ mixin”是类及其超类之间的区别。
对于类K
,区别在于在extends子句之后的声明中的所有内容:
implements I, J {
int thrice(x) => 3* x;
}
当您随后通过将混合作为A
应用于另一个类B
来创建新类class A = B with K;
时,结果类实际上就是:
class A extends B implements I, J {
int thrice(x) => 3* x;
}
此类实现接口I
和J
,并具有从twice
继承的B
方法和从{{1 }}。
(此示例不是有效的Dart2。在Dart 2中,您无法从除thrice
以外的超类的类声明中提取接口。要声明具有super-概念的mixin类,则必须使用K
声明:
Object
)。