C#學習(二):介面

來源:互聯網
上載者:User

標籤:通過   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#學習(二):介面

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.