【问题标题】:dart typedef subclass function fails [duplicate]dart typedef子类函数失败[重复]
【发布时间】:2020-09-15 11:02:12
【问题描述】:

我有一个函数签名

typedef ActionFunc = void Function(SamModel sm,SamReq req);

我有一个继承 SamModel 的类

class Rocket extends SamModel {

这是失败的代码

  void lightRocket(Rocket r,SamReq req) {
    ...
  }

  void addFunc(String str,ActionFunc af) {
   ...
  }

  ... 

  addFunc("func-name",lightRocket); //<--- fails at this point

上面的失败,Dart 说:

'''type '(Rocket, SamReq) => void' 不是类型'(SamModel, SamReq) => void'``

当我将 lightRocket 重新编码为:

  void lightRocket(SamModel sm,SamReq req) {
    Rocket r = sm as Rocket; // Can i get rid of this?
    ...
  }

它有效。我有许多要添加的功能,例如lightRocket,并且想消除强制转换操作。这可能使用泛型或其他技巧吗?

【问题讨论】:

  • 链接的问题是用不同的参数问同样的事情。您的 typedef 表示该函数将接受 SamModel。但是,当您将函数限制为仅采用 Rockets 时,它在采用其他 SamModel 参数时不再有效。如果您创建另一个扩展 SamModel 的类,您的 typedef 表示该函数应该能够接受它,但 lightRocket 将无法这样做,因为您将其限制为仅 Rockets。
  • 上述链接中的这句话有帮助。谢谢。请注意,这并不特定于方法覆盖。一般情况下,即使窄类型派生自更宽类型,也不能在预期采用更宽类型的函数的情况下使用采用较窄类型的函数。)我将尝试使用协变关键字。
  • 完美。协变完成了这项工作。

标签: dart subclass typedef


【解决方案1】:

正确的解决办法是:

void lightRocket(covariant Rocket r,SamReq req) {
    ...
}

谢谢https://stackoverflow.com/users/13250142/christopher-moore

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 2013-12-29
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2016-01-21
    • 2014-10-19
    相关资源
    最近更新 更多