【问题标题】:Extending a class with only one factory constructor扩展一个只有一个工厂构造函数的类
【发布时间】:2013-09-02 01:46:46
【问题描述】:

我想知道哪个是扩展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 或这种形式的任何类的最佳方式是什么?

【问题讨论】:

  • 似乎根本不可能扩展CustomEvent。我试图超越它,结果却出现了运行时错误:内部错误:'[文件名]':错误:第 3 行 pos 7:类'MyEvent'正在尝试扩展本机字段类,但库'[相同的文件名]' 没有本地解析器”。我不知道是否可以解决这个问题,抱歉。

标签: dart


【解决方案1】:

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

例如:

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);
}

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

【讨论】:

  • 这将如何影响性能?我可以想象反射是一项昂贵的操作。
  • 我这里使用反射来简化代码sn-p。更好的实现是定义所有方法,如 method1 => _delegate.method1()
  • Dart/Flutter 文档指出不使用反射是因为使用摇树时不方便
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    import event_extension.dart
    
    final event = CustomEvent(1);
    event.increaseCount();
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-08-05
        • 2020-10-21
        • 1970-01-01
        • 2015-06-02
        • 2013-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多