【发布时间】: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。 -
上述链接中的这句话有帮助。谢谢。请注意,这并不特定于方法覆盖。一般情况下,即使窄类型派生自更宽类型,也不能在预期采用更宽类型的函数的情况下使用采用较窄类型的函数。)我将尝试使用协变关键字。
-
完美。协变完成了这项工作。