簡體   English   中英

C#為什么不能重寫代理?

[英]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 ,我可以沒有找到一種方法來做到這一點:

  1. 將所有訂閱功能從ActionIssuerSimple復制到ActionIssuer。 這是不希望的,因為它不是DRY。 ActionIssuerSimple中的大多數代碼都圍繞着處理ActionHandlers列表。
  2. 讓所有不需要傳遞Action對象的ActionIssuers無論如何都要傳遞,就像int這樣可以降低成本。 這是不理想的,因為對於性能關鍵型應用程序,它會在高流量核心循環中消耗不必要的內存帶寬。 這也給我留下了ActionHandler方法中大量未使用的參數警告。

可以使用所需的委托類型作為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM