17

CustomEvent我想知道哪个是扩展类的最佳方式,一个只有一个工厂构造函数的类。我尝试执行以下操作并遇到了超级构造函数的问题:

class MyExtendedEvent extends CustomEvent {
  int count;

  factory MyExtendedEvent(num count) {
    return new MyExtendedEvent._internal(1);
  }

  MyExtendedEvent._internal(num count) {
    this.count = count;
  }
}

但我无法让它工作。我总是遇到:

未解决的对超级构造函数“CustomEvent()”的隐式调用

如果我尝试将内部构造函数更改为:

MyExtendedEvent._internal(num count) : super('MyCustomEvent') {
  this.count = count;
}

我最终得到:

'解决了对超级构造函数'CustomEvent()'的隐式调用''。

我不确定我做错了什么 - 但我想问题是CustomEvent只有一个构造函数是工厂构造函数(正如文档所说 - http://api.dartlang.org/docs/releases/latest/ dart_html/CustomEvent.html )

CustomEvent扩展 a或这种形式的任何类的最佳方法是什么?

4

4 回答 4

20

您不能使用工厂构造函数直接扩展类。但是,您可以实现该类并使用委托来模拟扩展。

例如 :

class MyExtendedEvent implements CustomEvent {
  int count;
  final CustomEvent _delegate;

  MyExtendedEvent(this.count, String type) :
    _delegate = new CustomEvent(type);

  noSuchMethod(Invocation invocation) =>
      reflect(_delegate).delegate(invocation);
}

注意:我在这里使用反射来简化代码片段。更好的实现(就性能而言)是定义所有方法,例如method1 => _delegate.method1()

于 2013-09-02T08:49:53.290 回答
2

不幸的是,如果一个类只有工厂构造函数,你就不能扩展它,你只能实现它。这不适用于 CustomEvent,因为它是一种 DOM 类型,这也是它只有工厂构造函数的原因:浏览器必须生成这些实例,Dart 对象只是一个包装器。如果你尝试实现 CustomElement 并触发一个,你可能会得到一个错误。

于 2013-09-02T18:04:36.957 回答
1

extension如果您只想向现有类添加一些方法,现在可以使用 Dart 的特性(来自 Dart 2.7)来获得类似的行为。

extension MyExtensionEvent on CustomEvent {
  void increaseCount() => count++;
}

然后当您想使用新创建的扩展时,您只需导入它,然后调用原始类的一个实例,但使用您新创建的方法之一:

import event_extension.dart

final event = CustomEvent(1);
event.increaseCount();
于 2020-09-23T11:39:22.980 回答
0

如果类只有 factory constructors(命名或未命名) 不能用于扩展。(但你可以使用这个类来implement子类)

所以如果你想通过超类扩展一个类,超类必须至少有一个生成构造函数。

于 2021-04-21T05:33:38.267 回答