澄清Dart中的mixins和实现

问题描述 投票:0回答:1

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。为什么Kthrice实现应用于B但其继承的twice实现不适用?

dart mixins
1个回答
1
投票

(请注意,链接的文章已过时,不适用于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;
}

该类实现接口IJ,并且具有从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; 

).

© www.soinside.com 2019 - 2024. All rights reserved.