澄清 Dart 中的混合和实现

Clarification on mixins and implementations in Dart

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;

文章接着说:

Now when we define A, we get the implementation of thrice() from K’s mixin. However, the mixin won’t provide us with an implementation of twice(). Fortunately, B does have such an implementation, so overall A does satisfy the requirements of I, J as well as S.

我不明白为什么 B 需要实施twice。为什么 Kthrice 实现应用于 B 而其继承的 twice 实现却没有?

(请注意,链接的文章已过时,不适用于 Dart 2。)

mixins 背后的想法是 "a mixin" 是 class 和它的超级 class 之间的区别。

对于 class K,区别在于它在扩展子句之后的声明中的所有内容:

                 implements I, J {
  int thrice(x) => 3* x;
}

然后,当您通过将该混合应用到不同的 class、B 来创建新的 class A 时,如 class A = B with K; 那么结果 class 本质上变成了:

class A extends B implements I, J {
  int thrice(x) => 3* x;
}

这个class实现了接口IJ,并且有一个twice方法继承自B和一个thrice方法混入 K.

(这个例子在 Dart 2 中是无效的。在 Dart 2 中,你不能从一个 class 声明中提取一个接口,除了 Object 之外还有一个超 class。要声明具有超级 class 概念的 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; 

).