本文將通過以下四個案例來分析c#中的介面究竟是如何工作的。
儘管c#在定義介面時不用指明介面方法的訪問控制方式,但預設介面方法均為public型(這可以從反編譯的il**中看到)。下面是使用reflector檢視的介面il**
.class private inte***ce abstract auto ansi icontrol}實現介面的類需要實現所有介面方法。通常情況下,介面的實現方法也為public型。如下案例:
using system ;inte***ce icontrol public class editbox: icontrol }class test }程式的執行結果為:
pain method is called!pain method is called!介面就好像是關係型資料庫中的一對多表,乙個介面對應多個介面方法,每個介面方法又對應虛擬方法表(vmt)中的某個公有或私有方法。上面**在記憶體中的映象可由下圖描述:
從圖中我們可以看到直接對paint方法的呼叫以及通過介面對paint方法的呼叫。可見通過介面對方法進行呼叫需要多出一道轉換工作,因此執行效率不如直接呼叫。
如果想將介面方法直接實現為私有方法是辦不到的。下面的editbox的**中paint方法沒有特殊說明,預設為private,導致**無法執行:
using system ;inte***ce icontrol public class editbox: icontrolpublic void showpaint()}class test }程式在編譯時將顯示如下編譯錯誤:「「editbox」不會實現介面成員「icontrol.paint()」。「editbox.paint()」或者是靜態、非公共的,或者有錯誤的返回型別。」
為什麼會這樣呢?如圖:
這是由於介面規範中的方法預設的訪問許可權是public,而類中的預設訪問許可權是default,也就是說private,因此導致許可權範圍收縮,兩者許可權並不相同,所以必須將類的許可權調整為public才可以使上面的**得以執行。
**如下:
using system ;inte***ce icontrol public class editbox: icontrolvoid icontrol.paint()public void showpaint() }class test }editbox類擁有一私有paint方法,但這並不是介面方法的實現(上例已經分析過)。editbox類中還包含了一「void icontrol.paint()」方法, 是該方法複寫了介面的paint方法,該方法是私有的(通過il**可以看出)。
注意:「void icontrol.paint()」前不能加任何的修飾限定符號,諸如public、private等,這在c#的語法中是不允許的。該方法反編譯得到的il**如下:
.class public auto ansi beforefieldinit editbox extends object implements icontrol}程式執行時記憶體中的映象可簡化表示為:
程式執行結果如下:
pain method is called!icontrol.pain method is called!icontrol.pain method is called!我們之所以可以通過
((icontrol)editbox).paint()
方法訪問到**是因為介面方法paint是公有的。但是我們不能通過editbox.paint()
方法訪問到**是因為editbox的paint方法是私有的。 在editbox內部,通過showpaint方法可以同時訪問私有的paint方法與介面icontrol.paint
方法。
如果editbox中的pait方法為公有並且同時提供了icontrol.paint方法,程式將是如何執行的呢?**如下:
using system ;inte***ce icontrol public class editbox: icontrolvoid icontrol.paint()}class test }程式執行結果如下:
pain method is called!icontrol.pain method is called!程式執行時記憶體布局如下:
可見,editbox中公有的paint方法並不是介面實現方法,真正的介面實現方法是icontrol.paint,這將導致editbox.paint()
方法與((icontrol)editbox).paint()
的執行結果並不一樣。
介面方法的實現通常是通過類中的公有方法實現的;
在一些特殊情況下(**隱藏、乙個類實現的兩個介面具有相同的介面方法等),需要專門實現某個介面的方法。
C 中的介面
介面是純抽象基類。介面是一種應用型別僅可以包括抽象成員。介面中的成員可以是events,methods,properties 和 indexers。當介面盡可以包括這些成員的宣告。在類中任何任何操作必須被實現。介面不能包含常量 字段 建構函式 析構函式和靜態成員。介面中的所有成員暗含是public。...
C 中的介面
儘管c 在定義介面時不用指明介面方法的訪問控制方式,但預設介面方法均為public型 這可以從反編譯的il 中看到 下面是使用reflector檢視的介面il class private inte ce abstract auto ansi icontrol 實現介面的類需要實現所有介面方法。通常情...
C 中的介面
本文將通過以下四個案例來分析c 中的介面究竟是如何工作的。儘管c 在定義介面時不用指明介面方法的訪問控制方式,但預設介面方法均為public型 這可以從反編譯的il 中看到 下面是使用reflector檢視的介面il class private inte ce abstract auto ansi ...