【发布时间】:2015-08-06 01:11:29
【问题描述】:
有没有办法实现在抽象父类中使用下游委托定义?
委托和类型一样,不能被覆盖:
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,如果没有任何一个,我都找不到这样做的方法:
- 将所有订阅功能从 ActionIssuerSimple 复制到 ActionIssuer。这是不可取的,因为它不是 DRY。 ActionIssuerSimple 中的大部分代码都围绕着操作一系列 ActionHandler。
- 让所有不需要传递 Action 对象的 ActionIssuer 都传递一个,例如 int 以降低成本。这是不可取的,因为它在性能关键的应用程序的高流量核心循环中占用了不必要的内存带宽。它还在 ActionHandler 方法中给我留下了一大堆未使用的参数警告。
【问题讨论】:
-
只能覆盖继承的虚拟成员。您的
ActionIssuer类不继承自ActionIssuerSimple -
@Fabjan 即使这样做,他也无法覆盖委托。委托是一种类型,而不是成员。
-
@SriramSakthivel 我知道。我只是说要覆盖某些东西,至少应该将其标记为
virtual并首先继承它... -
错字,感谢收看。
标签: c# inheritance delegates