有没有办法在抽象父类中实现下游委托(delegate)定义的使用?
委托(delegate),就像类型一样,不能被覆盖:
public abstract class ActionIssuerSimple
{
public delegate void ActionHandler();
...
public void Subscribe(ActionHandler handler) { ... }
}
public abstract class ActionIssuer<TAction> : ActionIssuerSimple
{
public override delegate void ActionHandler(TAction parameter);
...
}
上面给出了错误“delegate cannot be override”
目标是,给定一个 SillyIssuer : ActionIssuer<SillyAction>
的例子,让我能够使用 sillyIssuer.Subscribe((SillyAction action) => { ... });
(除了将 ActionIssuerSimple 用于可以运行带有签名 () => { }
的处理程序的操作之外。因为 C# 不支持在抽象类中使用下游委托(delegate)定义,无论是通过 abstract
、泛型类型参数还是 override
,我如果没有任何一个,就无法完全找到一种方法来做到这一点:
- 将所有订阅功能从 ActionIssuerSimple 复制到 ActionIssuer。这是不可取的,因为它不是 DRY。 ActionIssuerSimple 中的大部分代码都围绕操作 ActionHandler 列表展开。
- 让所有不需要传递 Action 对象的 ActionIssuer 无论如何都传递一个,比如 int 以降低成本。这是不可取的,因为它会在性能关键型应用程序的高流量核心循环中占用不必要的内存带宽。它还在 ActionHandler 方法中给我留下了一大堆未使用的参数警告。
最佳答案
在编译的程序集中可以看到委托(delegate)不能被覆盖的原因:
.class auto ansi sealed nested public ActionHandler
extends [mscorlib]System.MulticastDelegate
{
} // end of class ActionHandler
你看,ActionHandler 不是类的“真实字段”——它只是一个嵌套的密封类! :D
关于C# 为什么不能进行委托(delegate)覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31801889/