為什么不能把委托(delegate)放在一個接口(interface)當中?


stackoverflow上有人問,為什么不能把委托放在一個接口當中?

投票最多的第一個答案第一句話說,“A Delegate is just another type, so you don't gain anything by putting it inside the interface.”

翻譯過來大致意思就是:委托只是一種類型,把委托放在接口中你什么也得不到。

看上去挺拗口的,如果你也感覺這句話說的不知所雲,那么只能求助於MSDN的接口和委托的定義。

接口:只包含方法、屬性、事件或索引器的簽名。 實現接口的類或結構必須實現接口定義中指定的接口成員。

委托:是一種定義方法簽名的類型。 當實例化委托時,您可以將其實例與任何具有兼容簽名的方法相關聯。 您可以通過委托實例調用方法。

似乎還不能讓人滿意,我們看到接口中可以包含事件,再想一想事件和委托之間的關系,想一想常見的Delegate、EventHandler、 Predicate、Func、Action…

為什么接口中可以有事件而不能包含委托?

你現在有沒有陷入混亂而無語的恐慌當中?

 

換個角度從接口和委托的IL代碼來看本質,其實說清楚為什么不能把delegate放在一個interface當中非常簡單。

先看一個簡單的接口定義:

ISampleInterface

 IL反匯編代碼如下:

interface

我們看到接口的定義中,方法、屬性、索引器還有事件,本質上都是方法。其中索引器對應於get_Item,set_Item方法,屬性對應get_Message,set_Message方法,而事件對應於add_MyHandler和remove_MyHandler方法。所以說屬性、索引器還有事件只是語法糖而已。

我們再看下MSDN的委托示例:

public delegate int PerformCalculation(int x, int y);

它的反匯編代碼如下:

delegate

根據IL,我們發現編譯器自動將委托生成為一個繼承自System.MulticastDelegate的類。

所以回頭看委托的定義還是很有深刻意義的,委托只是一種定義方法簽名的類型。而我們平時說自定義一個類型,通常就是自定義一個類,其實還應該包括自定義一個委托。

分析到這里,我們可以得出結論,接口內只能定義本質為方法的成員,不能定義類。

為什么不能把委托(delegate)放在一個接口(interface)當中?因為委托是一個類,而接口當中不能定義類

 

參考:

http://stackoverflow.com/questions/612957/why-cant-i-put-a-delegate-in-an-interface


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM