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

Dart 仅使用一个工厂构造函数扩展类,dart,Dart,我想知道扩展CustomEvent类的最佳方法是什么,这个类只有一个工厂构造函数。我尝试执行以下操作,但遇到超级构造函数的问题: MyExtendedEvent类扩展CustomEvent{ 整数计数; 工厂MyExtendedEvent(数量计数){ 返回新的MyExtendedEvent.\u内部(1); } MyExtendedEvent.\u内部(数量计数){ this.count=计数; } } 但我不能让它工作。我经常遇到: 对超级构造函数“CustomEvent()”的未解析隐式

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

MyExtendedEvent类扩展CustomEvent{
整数计数;
工厂MyExtendedEvent(数量计数){
返回新的MyExtendedEvent.\u内部(1);
}
MyExtendedEvent.\u内部(数量计数){
this.count=计数;
}
}
但我不能让它工作。我经常遇到:

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

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

MyExtendedEvent.\u内部(num计数):super('MyCustomEvent'){
this.count=计数;
}
我的结局是:

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

我不确定我做错了什么-但我想问题是
CustomEvent
只有一个构造函数是工厂构造函数(正如doc所说-)

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

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

例如:

MyExtendedEvent类实现CustomEvent{ 整数计数; 最终定制活动代表; MyExtendedEvent(this.count,字符串类型): _委托=新CustomEvent(类型); noSuchMethod(调用)=> 反射(_delegate).delegate(调用); }
注意:我在这里使用反射来简化代码片段。更好的实现(就性能而言)是定义所有方法,如
method1=>\u delegate.method1()

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

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

extension MyExtensionEvent on CustomEvent {
  void increaseCount() => count++;
}
然后,当您想要使用新创建的扩展时,您只需导入它,然后使用新创建的方法之一调用原始类的实例:

import event_extension.dart

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

如果类只有工厂构造函数(命名或未命名),不能用于扩展。(但是您可以使用该类来
实现
子类)


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

扩展CustomEvent似乎根本不可能。我试图胜过它,结果却出现了一个运行时错误:内部错误:“[filename]”:错误:第3行位置7:class“MyEvent”试图扩展本机fields类,但库“[same filename]”没有本机解析程序“。我不知道是否可以解决这个问题,对不起。这将如何影响性能?我可以想象反射是一个昂贵的操作。我在这里使用反射来简化代码段。更好的实现方法是定义所有方法,如
method1=>\u delegate.method1()
Dart/flatter文档声明不使用反射,因为使用树抖动时不方便