情况如下:

abstract class A {
  void doSomething() => print('Do something..');
}

class B implements A {
  @override
  void doSomething() => print('Do something already..');
}

class C extends A {
}

我有一个抽象的A类.

一切正常,直到我将工厂构造函数添加到A类:

abstract class A {
  factory A() => new B();

  void doSomething() => print('Do something..');
}

这会在我的IDE中导致错误(IntelliJ IDEA):

需要生成构造函数,但工厂发现

我的第一个 idea 是为C类创建构造函数,在这里我会为A调用工厂构造函数.有可能吗?

当我try 扩展Exception类时,我遇到了同样的问题.它还有一个工厂构造函数:

abstract class Exception {
  factory Exception([var message]) => new _ExceptionImplementation(message);
}

这就是为什么要创建我的自定义异常,我必须实现Exception类,而不是扩展它,这真的让我感到困惑.

我还想澄清一个术语问题. 我可以说从B类的Angular 来看,A是一个接口,所以B实现的是接口A吗? 然而,从C类的Angular 来看,A是一个抽象类,所以C是对抽象类A的扩展.这些说法正确吗?

非常感谢.

德米特里.

推荐答案

如果类没有构造函数,则隐式添加生成构造函数.如果类有显式构造函数,则不添加生成构造函数. 你有两个 Select .

  • 使工厂构造函数成为命名工厂构造函数,并添加普通构造函数
abstract class A {
  void doSomething() => print('Do something..');
  factory A.name() => new B();
  A();
}
  • 或者命名普通构造函数并从扩展类显式调用它
abstract class A {
  void doSomething() => print('Do something..');
  factory A() => new B();
  A.protected();
}

class C extends A {
  C() : super.protected();
}

试试DartPad

你的说法是对的.如果您实现一个类,它将充当接口,如果您扩展它,它将充当基类.

Dart相关问答推荐

Dart中使用set表达式的switch语句

空值判断运算符 - Flutter

使用 2 个类型参数声明类型StateNotifierProvider,但给出了 1 个类型参数

是否从 Dart 中删除了interface关键字?

一键式 Flutter 工具提示

Dart 包版本如何工作以及我应该如何对我的 Flutter 插件进行版本控制?

Flutter 中的 authStateChanges

Dart/Flutter判断值是否为整数

Dart/Flutter 如何在 map 中初始化列表?

参数类型PointerEvent不能分配给参数类型PointerDownEvent

如何使用 Dart 动态加载 HTML 并插入我的网页?

不推荐使用AnteStorStateofType,请改用findAncestorStateOfType

找到两个数字中larger/smaller的方法是什么

在 Dart 中将 List 转换为字符串?

如何在 timeLimit 之后使future 的计算超时?

~ 在 Dart 中是什么意思?

导出两个具有相同类名的库

Dart MD5 字符串

Dart 中使用的包命名约定是什么?

将多张map合并/合并为一张map