C#中的接口

作者: 呂震宇  來源: 博客園  發布時間: 2009-02-27 13:56  閱讀: 7484 次  推薦: 0   原文鏈接   [收藏]  
 
摘要:本文將通過以下四個案例來分析C#中的接口究竟是如何工作的。
[1] 公有方法實現接口方法
[2] 私有方法不能實現接口方法
[3] 實現專門的接口方法(1)
[4] 實現專門的接口方法(2)

本文中所有圖示純為個人理解(參考了Assembly中元數據的存儲方式),與真實情況可能有所出入。 圖中綠色表示公有方法,紅色表示私有方法。

本文將通過以下四個案例來分析C#中的接口究竟是如何工作的。

1、公有方法實現接口方法

盡管C#在定義接口時不用指明接口方法的訪問控制方式,但默認接口方法均為public型(這可以從反編譯的IL代碼中看到)。下面是使用Reflector查看的接口IL代碼

.class private interface abstract auto ansi IControl
{
   .method public hidebysig newslot abstract virtual instance void Paint() cil managed
   {
   }
}

實現接口的類需要實現所有接口方法。通常情況下,接口的實現方法也為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();
   }
}

程序的執行結果為:

Pain method is called!
Pain method is called!

接口就好像是關系型數據庫中的一對多表,一個接口對應多個接口方法,每個接口方法又對應虛擬方法表(VMT)中的某個公有或私有方法。上面代碼在內存中的鏡像可由下圖描述:

從圖中我們可以看到直接對Paint方法的調用以及通過接口對Paint方法的調用。可見通過接口對方法進行調用需要多出一道轉換工作,因此執行效率不如直接調用。

 

0
0
 
標簽:CLR
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()