为何Dart编译器允许继承abstract interface class而不报错?
关于Dart中
abstract interface class可被继承的解释 你遇到的情况完全符合Dart的语法规则——abstract interface class既可以通过implements实现,也可以通过extends继承,这和你最初的理解偏差源于Dart对这类类的定位:
abstract interface class的核心是定义接口契约,要求所有遵循它的类必须实现所有抽象成员,但它并没有限制只能用implements来遵循契约。- 用
extends继承这类类时,子类会继承父类的抽象成员约束,只要在子类中完成所有抽象方法的实现(比如你代码里的MyClassExt),编译器就不会报错。 - 而
implements是另一种遵循契约的方式,它要求子类重新声明并实现所有接口成员,即便父类有具体实现(你的例子里都是抽象方法,所以两种方式表现相近)。
你的测试代码合法,整理后的代码如下:
void main() { MyClassImpl(); } abstract interface class MyClass { int return4(); } class MyClassExt extends MyClass { @override int return4() => 4; } class MyClassImpl implements MyClass { @override int return4() => 4; }
简言之,Dart的abstract interface class并没有禁止继承,它更侧重接口的契约属性,同时保留了类的继承能力。
内容的提问来源于stack exchange,提问作者thedannydarko
相关产品推荐
相关产品推荐

