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

Inheritance Dart 1.13是否放宽了mixin应用程序的超级接口要求?,inheritance,dart,mixins,Inheritance,Dart,Mixins,在以下来自的代码中,mixinK的应用程序不会产生任何警告,尽管它两次错过了超级接口方法(): 我主要是想填补我理解中的一些漏洞,因此希望有人能在我的问题中指出任何误用术语或错误概念。在Dart版本1.13中,混音器的工作方式发生了变化。它是在VM中实现的,但还没有在dart2js中实现,我也不确定分析器是什么 不过,E是一个非抽象类,它没有实现自己的接口(实现I,但没有两次的非抽象成员)。这将导致警告,混入或无混入 最重要的是,K扩展了S,因此当使用K作为mixin时,mixin应用程序的超类

在以下来自的代码中,mixin
K
的应用程序不会产生任何警告,尽管它两次错过了超级接口方法
):


我主要是想填补我理解中的一些漏洞,因此希望有人能在我的问题中指出任何误用术语或错误概念。

在Dart版本1.13中,混音器的工作方式发生了变化。它是在VM中实现的,但还没有在dart2js中实现,我也不确定分析器是什么

不过,
E
是一个非抽象类,它没有实现自己的接口(实现
I
,但没有两次
的非抽象成员)。这将导致警告,混入或无混入


最重要的是,
K
扩展了
S
,因此当使用
K
作为mixin时,mixin应用程序的超类还应该实现
S
,而
D
没有实现。这应该是另一个警告。

感谢您指出E没有实现自己的接口。我在文档中的某个地方看到,这种带有赋值语句的类创建形式在默认情况下会产生一个抽象类。如果你想要一个具体的类,使用标准形式“classe用K{}扩展D”。顺便说一句,使用上面的class语句的“标准”形式也不会产生任何警告。很明显,这里的分析器有点落后于规范。
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
}