Dart 1.13是否放宽了mixin应用程序的超接口要求?

时间:2015-11-29 07:28:55

标签: inheritance dart mixins

Mixins in Dart的以下代码中,尽管错过了超接口方法K,但mixin twice()的应用程序却没有警告:

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;

class D {
  double(x) => x+x;
}

// E missing 'twice', thus not conforming to
// superinterface S of K. Yet no warning in
// checked mode under Dart 1.13.
class E = D with K;

main() {
  /// A conforms to superinterface S of K
  assert(new A().twice (1) == 2);
  assert(new A().thrice(1) == 3);

  /// E conforms to superinterface S of K
//assert(new E().twice (1) == 2);  // NoSuchMethod 'twice'
  assert(new E().thrice(1) == 3);  // thrice() Provided by K
}

我主要只是想在我的理解中填补一些漏洞,所以我希望有人在我的问题中指出任何滥用术语或不良概念的行为。

1 个答案:

答案 0 :(得分:2)

在Dart版本1.13中,mixins的工作方式有所变化。它已在VM中实现,但还没有在dart2js中实现,而且我对分析器不确定。

仍然,E是一个非抽象类,它没有实现自己的接口(实现I但没有非抽象twice成员)。这应该引起警告,混合或没有混合。

最重要的是,K扩展了S,因此当使用K作为mixin时,mixin应用程序的超类也应该实现S D { {1}}并非如此。这应该给出另一个警告。