[英]C# Why is Delegate override not possible?
是否有任何方法可以在抽象父類中使用下游委托定義?
代表(如類型)不能被覆蓋:
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 : ActionIssuer<SillyAction>
,讓我能夠使用sillyIssuer.Subscribe((SillyAction action) => { ... });
(除了將ActionIssuerSimple用於可以運行帶有簽名() => { }
處理程序的動作之外。由於C#不支持在抽象類中使用下游Delegate定義,因此既不能通過abstract
,泛型類型參數也不能通過override
,我可以沒有找到一種方法來做到這一點:
可以使用所需的委托類型作為ActionIssuer
變成通用類的類型參數。
不確定您要達到的目標。 您可以覆蓋屬性/方法而不是類型。 委托是一種類型,重寫委托是什么意思?
我想您需要一個泛型委托,可以將其用作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不是類的“真實字段”,它只是嵌套的密封類! :D
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.