1.接口的聲明
接口的聲明不能包含:數據成員,靜態變量;只能包含如下類型的靜態成員函數的聲明:方法,屬性,事件,索引器。聲明中不能包含任何實現的代碼,而在每個成員成名的主體后,必須使用分號。
接口聲明可以有任何的修飾符public、protect、internl或private。
接口的成員是隱式的public,不允許任何訪問修飾符,包括public。
1 Public Interface IMyInterface 2 { 3 //接口成員是隱式的public,並且只有聲明 4 int Method1(int nVar1,int nVar2) ; 5 }
2.接口的實現
只有類和結構體才能實現接口,並且必須在基類列表中包括接口名稱;使用接口的類或結構需要為接口的每一個成員提供實現。
1 Class MyClass:IMyInterface 2 { 3 //在進行隱式的實現接口成員的時候,訪問修飾符要設為public 4 public int Method(int a,int b) 5 { 6 Console.WriteLine("{0}",a+b); 7 return a+b; 8 } 9 }
如果一個類即繼承了基類,又實現了接口,那么在這個類的基類列表中的基類名稱必須放在所有的接口的前面。並且一個類只能有一個基類,列出的其他類型必須都是接口名。
接口不僅僅是類或結構要實現的成員列表,它是一個引用類型,我們不能直接通過類對象的成員訪問接口,然而我們可以通過把類對象引用強制轉換為接口類型來獲取指向接口的引用。這樣我們就可以使用點號來調用接口的方法了。這里轉換推薦用as進行轉換。
1 Static void Main(string[] args) 2 { 3 int a = 5; 4 int b = 8; 5 MyClass mc = new MyClass(); 6 //調用類對象的實現方法 7 mc.Method(a,b); 8 //將類型轉化為接口類型 9 IMyInterface mif = mc as IMyInterface; 10 mif.Method(a,b); 11 }
輸出結果:13
13
利用as進行強制轉換的好處:如果類實現了接口就會返回接口的引用(平安無事)如果類沒有實現接口就會拋出異常,方便及時的發現錯誤。
3.實現多個接口
類或結構可以實現任意數量的接口。
所有實現的接口必須列在基類列表中且以逗號分隔。
如果一個類實現的兩個接口當中有重復的成員(具有相同的簽名和相同的返回類型),那么在該類實現接口成員的時候,實現一次就可以滿足所有包含重復成員的接口。
1 interface interface1 { void Method(int a ,int b);} 2 interface interface2 { void Method(int a, int b);} 3 //實現多個接口用逗號相隔 4 public class MyClass : interface1, interface2 5 { 6 /* 7 * 如果兩個接口成員函數的返回類型和參數一致, 8 * 那么進行一次實現就可以了 9 */ 10 public void Method(int a, int b) 11 { 12 Console.WriteLine("{0}", a + b); 13 } 14 }
如果想刻意的分離這兩個接口的接口成員,就需要創建顯式的接口成員成員實現。格式:接口名稱+點分隔符+接口的成員函數。注意:在顯示的調用接口成員的時候,已經默認為public,不能再添加訪問修飾符了。
1 interface interface1 { void Method(int a ,int b);} 2 interface interface2 { void Method(int a, int b);} 3 //實現多個接口用逗號相隔 4 public class MyClass : interface1, interface2 5 { 6 //顯示的實現interface1的接口成員 7 //已經默認為public,不能添加訪問修飾符了 8 void interface1.Method(int a, int b) 9 { 10 Console.WriteLine("{0}", a + b); 11 } 12 void interface2.Method(int a, int b) 13 { 14 Console.WriteLine("{0}", a + b); 15 } 16 }
但是這樣就只有顯式接口成員的實現,而沒有類級別的實現,所以在實例化該類的對象后,是無法點出該方法的。如果有顯式接口成員實現,類級別的實現是允許的,但是不是必須的。並且顯式接口成員實現智能通過指向接口的引用來訪問,即使是類當中的成員函數來對接口成員進行訪問。
如果一個類實現了接口,那么它的子類也會繼承其基類實現的接口成員,無需再次實現。
4.接口的繼承
要指定某個接口繼承其他接口,應在接口聲明中把接口以逗號分隔的列表形式放在接口名稱之后。和類的繼承格式相同。但是又與類不同,一個接口可以繼承任意多個接口,可以進行多重繼承。子接口除了包含自己聲明的接口之外還包括所有父接口的所有接口成員。
5.代碼Demo
1 namespace ConsoleApplication2 2 { 3 interface ILoveWorld { void SayHello();} 4 class Creature{} 5 6 //基類和接口同時實現的時候,基類要放在最前面 7 class Person : Creature,ILoveWorld 8 { 9 //隱式的聲明接口,既可以被類的對象訪問,又可以轉換為接口引用對象訪問 10 void SayHello() 11 { 12 Console.WriteLine("Hello World!"); 13 } 14 //顯式的聲明接口成員,只能轉換為接口引用對象來訪問 15 void ILoveWorld.SayHello() 16 { 17 Console.WriteLine("Hello World!"); 18 } 19 } 20 class Cat : Creature, ILoveWorld 21 { 22 //相對於顯式的接口實現方式。類級別的接口實現不是必須的。 23 void ILoveWorld.SayHello() 24 { 25 Console.WriteLine("MiaoMiaoMiao"); 26 } 27 } 28 class Dog : Creature, ILoveWorld 29 { 30 //在顯式調用接口成員的時候不能用public 31 void ILoveWorld.SayHello() 32 { 33 Console.WriteLine("WangWangWang"); 34 } 35 } 36 class Program 37 { 38 static void Main(string[] args) 39 { 40 //聲明一個Creature的數組 41 Creature[] pCreatureArray = new Creature[3]; 42 //這里用到了上次學的面向對象的IS-A的關系 43 pCreatureArray[0] = new Person(); 44 pCreatureArray[1] = new Cat(); 45 pCreatureArray[2] = new Dog(); 46 foreach (var creature in pCreatureArray) 47 { 48 //利用as進行轉換 49 ILoveWorld b = creature as ILoveWorld; 50 b.SayHello(); 51 } 52 Console.ReadKey(); 53 } 54 } 55 }
運行結果:

