我想知道哪个是扩展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
或此表单的任何类的最佳方法是什么?
答案 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
子类)
因此,如果您想通过超类扩展一个类,则该超类必须至少具有至少一个生成构造函数。