C 中的介面

2021-04-06 19:41:50 字數 2487 閱讀 2404

本文將通過以下四個案例來分析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: icontrol 

public void showpaint()

}

class test 

}程式在編譯時將顯示如下編譯錯誤:「「editbox」不會實現介面成員「icontrol.paint()」。「editbox.paint()」或者是靜態、非公共的,或者有錯誤的返回型別。」

為什麼會這樣呢?如圖:

這是由於介面規範中的方法預設的訪問許可權是public,而類中的預設訪問許可權是default,也就是說private,因此導致許可權範圍收縮,兩者許可權並不相同,所以必須將類的許可權調整為public才可以使上面的**得以執行。

**如下:

using system ;

inte***ce icontrol 

public class editbox: icontrol 

void 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: icontrol 

void 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 中只允許樹形結構中的單繼承,即乙個類只能繼承乙個父類,所以介面是讓乙個類具有兩個以上 基類的唯一方式。宣告 介面宣告的方式與宣告類的方式相似,但使用的 關鍵字是 inte...