仅使用一个工厂构造函数扩展类

时间:2013-09-02 01:46:46

标签: dart

我想知道哪个是扩展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或此表单的任何类的最佳方法是什么?

4 个答案:

答案 0 :(得分:11)

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

例如:

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()

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

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

import event_extension.dart

final event = CustomEvent(1);
event.increaseCount();

答案 3 :(得分:0)

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

因此,如果您想通过超类扩展一个类,则该超类必须至少具有至少一个生成构造函数。