C# 为什么不能进行委托(delegate)覆盖?

标签 c# inheritance delegates

有没有办法在抽象父类中实现下游委托(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,我如果没有任何一个,就无法完全找到一种方法来做到这一点:

  1. 将所有订阅功能从 ActionIssuerSimple 复制到 ActionIssuer。这是不可取的,因为它不是 DRY。 ActionIssuerSimple 中的大部分代码都围绕操作 ActionHandler 列表展开。
  2. 让所有不需要传递 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/

相关文章:

c# - 从字节数组中获取要作为附件发送的文件

ios - 'UIViewController' 没有可见的 @interface 声明选择器

c# - 关于 C# 委托(delegate)的一个问题

ios - 在 MKMapViewDelegate 中执行代码之前设置一个计时器

c# - 在 MVVMCross 中,是否可以关闭 View 模型并将值传递回导航堆栈中的前一个 View 模型?

c# - 有没有办法连接 C# 匿名类型?

c# - 在 C# 中以编程方式获取控件名称

c++ - CStatic 自定义控件

抽象类中的 C++ 运算符重载

c++ - 层次结构中指向类的指针的相等性