C#为什么不能覆盖Delegate覆盖?

时间:2015-08-04 06:12:40

标签: c# inheritance delegates

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

代表与类型一样,无法覆盖:

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);
    ...
}

上面给出了错误“委托不能覆盖”

给定SillyIssuer : ActionIssuer<SillyAction>的示例,我的目标是能够使用sillyIssuer.Subscribe((SillyAction action) => { ... });(除了使用ActionIssuerSimple执行可以运行带有签名() => { }的处理程序的操作。因为C#不支持在抽象类中使用下游委托定义,无论是通过abstract,泛型类型参数还是override,我都找不到这样做的方法:

  1. 将所有订阅功能从ActionIssuerSimple复制到ActionIssuer。这是不合需要的,因为它不是DRY。 ActionIssuerSimple中的大多数代码都围绕着操作ActionHandler列表。
  2. 让所有不需要传递Action对象的ActionIssue都会传递一个,就像int一样可以降低成本。这是不可取的,因为它在高流量核心环路中耗尽了不必要的内存带宽,用于性能关键型应用程序。它还在ActionHandler方法中留下了大量未使用的参数警告。

3 个答案:

答案 0 :(得分:2)

可以使用所需的委托类型作为ActionIssuer的类型参数转换为泛型类。

答案 1 :(得分:1)

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

我猜您需要一个通用委托,您可以将其作为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) => { ... });

答案 2 :(得分:1)

在编译的程序集中可以看到委托不能被覆盖的原因:

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

你看,ActionHandler不是这个类的“真实领域” - 它只是一个嵌套的密封类! :d