澄清Dart中的mixin和实现

时间:2019-03-20 10:32:18

标签: dart mixins

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的实现?

1 个答案:

答案 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;
}

此类实现接口IJ,并具有从twice继承的B方法和从{{1 }}。

(此示例不是有效的Dart2。在Dart 2中,您无法从除thrice以外的超类的类声明中提取接口。要声明具有super-概念的mixin类,则必须使用K声明:

Object

)。