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

C# Why is Delegate override not possible?

有没有办法在抽象父级中实现下游委托定义的使用class?

委托,就像类型一样,不能被覆盖:

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# 不支持在抽象 class 中使用下游委托定义,既不支持通过 abstract、泛型类型参数,也不支持 override,我无法完全找到没有任何一个的方法:

  1. 正在将所有订阅功能从 ActionIssuerSimple 复制到 ActionIssuer。这是不可取的,因为它不是 DRY。 ActionIssuerSimple 中的大部分代码都围绕操作 ActionHandler 列表展开。
  2. 让所有不需要传递 Action 对象的 ActionIssuer 无论如何都传递一个,比如 int 以降低成本。这是不可取的,因为它会在性能关键型应用程序的高流量核心循环中占用不必要的内存带宽。它还在 ActionHandler 方法中给我留下了一大堆未使用的参数警告。

可以使用所需的委托类型作为 ActionIssuer 的类型参数变成通用 class。

不确定您要实现的目标。您可以覆盖 Property/Method 而不是类型。委托是一种类型,覆盖委托是什么意思?

我想您需要一个通用委托,您可以将其作为 ActionIssuer<TAction>.Subscribe 方法中的参数。

public delegate void ActionHandler<TAction>(TAction parameter);

public abstract class ActionIssuer<TAction>
{
    public void Subscribe(ActionHandler<TAction> handler) { ... }
    ...
}

那你可以

sillyIssuer.Subscribe((SillyAction action) => { ... });

无法覆盖委托的原因在编译的程序集中可见:

.class auto ansi sealed nested public ActionHandler
   extends [mscorlib]System.MulticastDelegate
{
} // end of class ActionHandler 

你看,ActionHandler 不是 class 的 'real field' - 它只是一个嵌套的密封 class! :D