標籤:tool .com gif 相同 寫法 有一個 託管 直接 查看
1.介面的特點
介面的定義是指定一組函數成員而不實現成員的參考型別,其它類型和介面可以繼承介面。定義還是很好理解的,但是沒有反映特點,介面主要有以下特點:
(1)通過介面可以實現多重繼承,C#介面的成員不能有public、protected、internal、private等修飾符。原因很簡單,介面裡面的方法都需要由外面介面實現去實現方法體,那麼其修飾符必然是public。C#介面中的成員預設是public的,java中是可以加public的。
(2)介面成員不能有new、static、abstract、override、virtual修飾符。有一點要注意,當一個介面實現一個介面,這2個介面中有相同的方法時,可用new關鍵字隱藏父介面中的方法。
(3)介面中只包含成員的簽名,介面沒有建構函式,所有不能直接使用new對介面進行執行個體化。介面中只能包含方法、屬性、事件和索引的組合。介面一旦被實現,實作類別必須實現介面中的所有成員,除非實作類別本身是抽象類別。
(4)C#是單繼承,介面是解決C#裡面類可以同時繼承多個基類的問題。
2.介面的簡單使用
class Program { static void Main(string[] args) { IWorker james1 = new James1(); IWorker james2 = new James2(); james1.work("設計"); james2.work("編程"); //從這個例子我體會到了有介面的好處,可以想象如果又來了新的員工。 //如果不採用介面,而是每個員工都有一個單獨的類,這樣就會容易出錯。 //如果有介面這種協議約束的話,那麼只要實現了介面就肯定有介面裡聲明的方法,我們只需拿來調用。 } } public interface IWorker{ void work(string s); } class James1 : IWorker { public void work(string s) { Console.WriteLine("我的名字是James1,我的工作是" +s); } } class James2 : IWorker { public void work(string s) { Console.WriteLine("我的名字是James2,我的工作是"+s); } }
3.一個可以執行個體化介面的特例
class Program { static void Main(string[] args) { //C#中COM介面是可以執行個體化的,但其實這種寫法是使介面“映射”到某一個類上,實際上建立的是這個類的執行個體。 IWorker worker = new IWorker(); } } [ComImport, CoClass(typeof(James1))] [Guid("d60908eb-fd5a-4d3c-9392-8646fcd1edce")] public interface IWorker{ void work(string s); } //ComImport特性發生在tlbimp.exe匯入COM類型類庫的時候,產生的託管類型會標記有ComImport特性 //Guid特性是一個GUID標識,COM類型是用GUID來標識的。
利用.NET Reflector查看時可以很明顯的看到Main方法裡面的代碼是:IWorker worker=new James1();
4.介面和抽象類別的區別
介面用於規範,抽象類別用於共性。抽象類別是類,所以只能被單繼承,但是介面卻可以一次實現多個。
介面中只能聲明方法,屬性,事件,索引器。而抽象類別中可以有方法的實現,也可以定義非靜態類變數。
抽象類別可以提供某些方法的部分實現,介面不可以。抽象類別的執行個體是它的子類給出的。介面的執行個體是實現介面的類給出的。
在抽象類別中加入一個方法,那麼它的子類就同時有了這個方法。而在介面中加入新的方法,那麼實現它的類就要重新編寫(這就是為什麼說介面是一個類的規範了)。
介面成員被定義為公用的,但抽象類別的成員也可以是私人的、受保護的、內部的或受保護的內部成員(其中受保護的內部成員只能在應用程式的代碼或衍生類別中訪問)。此外介面不能包含欄位、建構函式、解構函式、靜態成員或常量。
還有一點,我們在VS中實現介面時會發現有2個選項,一個是實現介面,一個是顯示實現介面。實現介面就是我們平常理解的實現介面,而顯示實現介面的話,實現的方法是屬於介面的,而不是屬於實作類別的。
C# 介面