標籤:通過 c# this 參考 重複 成員函數 function 簽名 str
什麼是介面?
介面,是指定一組函數成員而不實現它們的參考型別(所以只能用類和結構來實現介面)。
介面的聲明
聲明一個介面的文法如下(按照標準來說,介面名稱從大寫的‘I‘開始):
1 interface IinterfaceName2 {3 /*成員函數4 func1(...);5 func2(...);6 .....7 */8 }
值得注意的幾點:
1)介面聲明不能包含資料成員和靜態成員。非靜態成員只能包含方法、屬性、事件和索引器。
2)介面的聲明可以有任何的存取修飾詞,如public、private等。但是,介面內的成員是隱式的public,而且介面內的成員不能顯式地指明任何存取修飾詞。
介面的實現
實現一個介面的文法如下:
1 //聲明介面 2 interface IPrint 3 { 4 void printMessage(string msg);//介面中不實現方法 5 } 6 7 //實現介面的類 8 class MyClass: IPrint 9 {10 //類內建的方法11 void MyFunc()12 {13 Console.WriteLine("This is my own function."); 14 }15 16 //實現介面的方法17 void printMessage(string msg)18 {19 Console.WriteLine("Message is : {0}",msg);20 }21 }22 23 class Program24 {25 static void Main()26 {27 MyClass mc = new MyClass();28 mc.printMessage("I implemented an interface");29 }30 }
我們也可以通過介面的引用來調用實現方法,文法如下:
IPrint iprt = (IPrint)mc; //將類對象的引用轉換為介面類型的引用 iprt.printMessage("Print a msg."); //調用引用方法
或者使用as運算子(如果轉換失敗as運算子會返回一個null的引用):
IPrint p = mc as IPrint; //使用as轉換 if(p != null) //別忘了判斷p的引用是否為空白 p.printMessage("Some msg.");
註:如果一個類從基類中繼承並實現了介面,則該類的基類列表中的基類名稱必須在所有介面之前。
類可以實現多個介面
類可以實現多個介面的方法,而且如果一些介面有相同簽名和相同傳回型別的成員,那麼類可以實現單個成員來滿足所有包含重複成員的介面,代碼如下:
interface IIfc1{ void PrintOut(string s);} interface IIfc2{ void PrintOut(string t);} class MyClass2:IIfc1,IIfc2{ public void PrintOut(string s) //兩個介面的單一實現 { Console.WriteLine("This is a msg: {0}",s); }}
當然,在某些情況下,可能會需要對每一個介面都有單獨的實現,這時候可以指定顯式的介面成員。
class MyClass2:IIfc1,IIfc2{ public void IIfc1.PrintOut(string s) //IIfc1顯式介面成員的實現 { Console.WriteLine("This is a IIfc1‘s msg: {0}",s); } public void IIfc2.PrintOut(string s) //IIfc2顯式介面成員的實現 { Console.WriteLine("This is a IIfc2‘s msg: {0}",s); }}//然後在Main方法中調用class Program{ static void Main() { MyClass2 mc2 = new MyClass2(); IIfc1 ifc1 = (IIfc1)mc2; ifc1.PrintOut("interface 1"); IIfc2 ifc2 = (IIfc2)mc2; ifc2.PrintOut("interface 1"); }}
需要注意的是,同一個類中,其他的成員不能夠直接地訪問顯式介面成員:
class MyClass3:IIfc1{ void IIfc1.PrintOut(string s) { Console.WriteLine("IIfc1: {0}" , s); } void MyFunc() { PrintOut("Fail."); //編譯錯誤,失敗 this.PrintOut("Fail."); //編譯錯誤,失敗 ((IIfc1)this).PrintOut("Success."); //成功調用方法 }}
派產生員作為實現
實現介面的類可以繼承基類中實現的代碼,即使衍生類別不包含任何成員:
interface IIfc1{ void PrintOut(string s);}class BaseClass:IIfc1 //基類{ public void PrintOut(string s) //實現介面的方法 { Console.WriteLine("A message: {0}", s); }}class DerivedClass:BaseClass, IIfc1 //衍生類別{}class Program{ static void Main() { DerivedClass dc = new DerivedClass(); dc.PrintOut("Success!"); }}
介面可以繼承介面
介面本身可以從一個或者多個介面繼承:
interface IIfc1{ void func1();}interface IIfc2{ void func2();}interface IIfc3:IIfc1,IIfc2{}class MyClass4:IIfc3{ public void func1() { //func1的實現 } public void func2() { //func2的實現 }}
繼承自基底介面的介面包含它聲明的所有介面和所有基底介面的成員。
參考資料
《C#圖解教程-第四版》 作者 【美】 Daniel M.Solis
C#學習(二):介面