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

mar*_*vic 8 dart

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

class MyExtendedEvent extends CustomEvent {
  int count;

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

  MyExtendedEvent._internal(num count) {
    this.count = count;
  }
}
Run Code Online (Sandbox Code Playgroud)

但我无法让它发挥作用.我总是碰到:

未解析的对超级构造函数'CustomEvent()'的隐式调用

如果我尝试将内部构造函数转换为:

MyExtendedEvent._internal(num count) : super('MyCustomEvent') {
  this.count = count;
}
Run Code Online (Sandbox Code Playgroud)

我最终得到:

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

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

扩展CustomEvent此表单的任何类的最佳方法是什么?

Ale*_*uin 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);
}
Run Code Online (Sandbox Code Playgroud)

注意:我在这里使用了反射来简化代码片段.一个更好的实现(关于性能)将是定义所有方法,如method1 => _delegate.method1()

  • 我在这里使用了反射来简化代码片段.更好的实现方法是定义所有方法,如`method1 => _delegate.method1()` (3认同)

Jus*_*ani 5

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