为什么抽象类实例化不是dart中的运行时错误?

Mic*_*jer 3 abstract-class abstract dart

在许多语言中,如果您尝试实例化抽象类,则会出现编译时错误.但是在Dart中,在编译和运行时异常时会收到警告AbstractClassInstantiationError.

这是为什么?有人可以提供一个例子,编译这样的代码是合理的吗?

Mic*_*jer 5

看来答案是抽象类中的工厂构造函数

abstract class Foo {
  factory Foo() { // make Foo appear to be instantiable
    return new Bar();
  }
  some(); // some abstract method
  Foo.name() {} just a named constructor
}

class Bar extends Foo {
  Bar():super.name(); // call named super constructor
  some() {} // implement abstract method
}

main() {
  print(new Foo()); // "instantiate" abstract Foo
}
Run Code Online (Sandbox Code Playgroud)

输出:

Instance of 'Bar'
Run Code Online (Sandbox Code Playgroud)


lrn*_*lrn 5

Dart尝试允许您在开发程序时运行程序.这就是为什么许多其他语言中的编译时错误都是Dart中的编译时警告和运行时错误的原因.这包括"x is Foo",其中Foo不存在,使用不存在的类型进行类型注释,以及调用部分(抽象)类的构造函数.

简而言之:因为它不是一个阻止程序编译的问题(不像语法错误可能意味着文件的其余部分被错误地解释),所以没有理由阻止你运行代码.只有当你点击实际取决于问题的分支时才会停止你的程序.