淺談C#接口方法
1.公有方法實現(xiàn)C#接口方法
盡管C#在定義接口時不用指明接口方法的訪問控制方式,但默認接口方法均為public型(這可以從反編譯的IL代碼中看到)。下面是使用Reflector查看的接口IL代碼:
- class private interface abstract auto ansi IControl{
- method public hidebysig newslot abstract virtual instance void Paint() cil managed{
- }
- }
實現(xiàn)接口的類需要實現(xiàn)所有接口方法。通常情況下,接口的實現(xiàn)方法也為public型。如下案例:
- using System ;
- interface IControl
- {
- void Paint();
- }
- public class EditBox: IControl
- {
- public void Paint()
- {
- Console.WriteLine("Pain method is called!");
- }
- }
- class Test
- {
- static void Main()
- {
- EditBox editbox = new EditBox();
- editbox.Paint();
- ((IControl)editbox)。Paint();
- }
- }
接口就好像是關(guān)系型數(shù)據(jù)庫中的一對多表,一個接口對應(yīng)多個接口方法,每個接口方法又對應(yīng)虛擬方法表(VMT)中的某個公有或私有方法??梢娡ㄟ^接口對方法進行調(diào)用需要多出一道轉(zhuǎn)換工作,因此執(zhí)行效率不如直接調(diào)用。
2.私有方法不能實現(xiàn)C#接口方法
如果想將接口方法直接實現(xiàn)為私有方法是辦不到的。下面的EditBox的代碼中Paint方法沒有特殊說明,默認為private,導(dǎo)致代碼無法執(zhí)行:
- using System ;
- interface IControl
- {
- void Paint();
- }
- public class EditBox: IControl
- {
- void Paint()
- {
- Console.WriteLine("Pain method is called!");
- }
- public void ShowPaint()
- {
- this.Paint();
- ((IControl)this)。Paint();
- }
- }
- class Test
- {
- static void Main()
- {
- EditBox editbox = new EditBox();
- editbox.ShowPaint();
- }
- }
程序在編譯時將顯示如下編譯錯誤:“”EditBox“不會實現(xiàn)接口成員”IControl.Paint()“?!盓ditBox.Paint()“或者是靜態(tài)、非公共的,或者有錯誤的返回類型。”
由于接口規(guī)范中的方法默認的訪問權(quán)限是public,而類中的默認訪問權(quán)限是default,也就是說private,因此導(dǎo)致權(quán)限范圍收縮,兩者權(quán)限并不相同,所以必須將類的權(quán)限調(diào)整為public才可以使上面的代碼得以執(zhí)行。
3.實現(xiàn)專門的C#接口方法
- using System ;
- interface IControl
- {
- void Paint();
- }
- public class EditBox: IControl
- {
- void Paint()
- {
- Console.WriteLine("Pain method is called!");
- }
- void IControl.Paint()
- {
- Console.WriteLine("IControl.Pain method is called!");
- }
- public void ShowPaint()
- {
- this.Paint();
- ((IControl)this)。Paint();
- }
- }
- class Test
- {
- static void Main()
- {
- EditBox editbox = new EditBox();
- editbox.ShowPaint();
- //editbox.Paint();
- ((IControl)editbox)。Paint();
- }
- }
【編輯推薦】