熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

全面剖析C#接口編程之定義接口

2013-11-13 09:51:13  來源: .NET編程 

  從技術上講接口是一組包含了函數型方法的數據結構通過這組數據結構客戶代碼可以調用組件對象的功能

  定義接口成員
接口可以包含一個和多個成員這些成員可以是方法屬性索引指示器和事件但不能是常量操作符構造函數或析構函數而且不能包含任何靜態成員接口定義創建新的定義空間並且接口定義直接包含的接口成員定義將新成員引入該定義空間

說明

  · 接口的成員是從基接口繼承的成員和由接口本身定義的成員

  · 接口定義可以定義零個或多個成員接口的成員必須是方法屬性事件或索引器接口不能包含常數字段運算符實例構造函數析構函數或類型也不能包含任何種類的靜態成員

  · 定義一個接口該接口對於每種可能種類的成員都包含一個方法屬性事件和索引器

  · 接口成員默認訪問方式是public接口成員定義不能包含任何修飾符比如成員定義前不能加abstractpublicprotectedinternalprivatevirtualoverride 或static 修飾符

  · 接口的成員之間不能相互同名繼承而來的成員不用再定義但接口可以定義與繼承而來的成員同名的成員這時我們說接口成員覆蓋了繼承而來的成員這不會導致錯誤但編譯器會給出一個警告關閉警告提示的方式是在成員定義前加上一個new關鍵字但如果沒有覆蓋父接口中的成員使用new關鍵字會導致編譯器發出警告

  · 方法的名稱必須與同一接口中定義的所有屬性和事件的名稱不同此外方法的簽名必須與同一接口中定義的所有其他方法的簽名不同

  · 屬性或事件的名稱必須與同一接口中定義的所有其他成員的名稱不同

  · 一個索引器的簽名必須區別於在同一接口中定義的其他所有索引器的簽名

  · 接口方法聲明中的屬性(attributes) 返回類型(returntype) 標識符(identifier)和形式參數列表(formalparameterlis)與一個類的方法聲明中的那些有相同的意義一個接口方法聲明不允許指定一個方法主體而聲明通常用一個分號結束

  · 接口屬性聲明的訪問符與類屬性聲明的訪問符相對應除了訪問符主體通常必須用分號因此無論屬性是讀寫只讀或只寫訪問符都完全確定

  · 接口索引聲明中的屬性(attributes)類型(type)和形式參數列表(formalparameterlist)與類的索引聲明的那些有相同的意義

  下面例子中接口IMyTest包含了索引指示器事件E方法F屬性P這些成員

  interface IMyTest{
    string this[int index] { get; set; }
    event EventHandler E ;
    void F(int value)  ;
    string P { get; set; }
}
public delegate void EventHandler(object sender EventArgs e) ;

  下面例子中接口IStringList包含每個可能類型成員的接口一個方法一個屬性一個事件和一個索引

  public delegate void StringListEvent(IStringList sender);
public interface IStringList
{
 void Add(string s);
 int Count { get; }
 event StringListEvent Changed;
 string this[int index] { get; set; }
}

  接口成員的全權名
使用接口成員也可采用全權名(fully qualified name)接口的全權名稱是這樣構成的接口名加小圓點 再跟成員名比如對於下面兩個接口

  interface IControl {
    void Paint( ) ;
}
interface ITextBox: IControl {
    void GetText(string text) ;
}

  其中Paint 的全權名是IControlPaintGetText的全權名是ITextBox GetText當然全權名中的成員名稱必須是在接口中已經定義過的比如使用ITextBoxPaint就是不合理的

  如果接口是名字空間的成員全權名還必須包含名字空間的名稱

  namespace System
{
    public interface IDataTable {
        object Clone( ) ;
    }
}

  那麼Clone方法的全權名是System IDataTableClone

  定義好了接口接下來我們關心的就是怎樣實現對接口的訪問這部分內容我將在下一篇文章中和您進一步探討

  定義接口的一般形式為
[attributes] [modifiers] interface identifier [:baselist] {interfacebody}[;]

  說明

  · attributes(可選)附加的定義性信息

  · modifiers(可選)允許使用的修飾符有new和四個訪問修飾符分別是newpublicprotectedinternalprivate在一個接口定義中同一修飾符不允許出現多次new修飾符只能出現在嵌套接口中

  表示覆蓋了繼承而來的同名成員The public protected internal and private修飾符定義了對接口的訪問權限

  · 指示器和事件

  · identifier接口名稱

  · baselist(可選):包含一個或多個顯式基接口的列表接口間由逗號分隔

  · interfacebody對接口成員的定義

  · 接口可以是命名空間或類的成員並且可以包含下列成員的簽名 方法屬性索引器

  · 一個接口可從一個或多個基接口繼承

  接口這個概念在C#和Java中非常相似接口的關鍵詞是interface一個接口可以擴展一個或者多個其他接口按照慣例接口的名字以大寫字母I開頭下面的代碼是C#接口的一個例子它與Java中的接口完全一樣

  interface IShape  {
    void Draw ( ) ;
}

  如果你從兩個或者兩個以上的接口派生父接口的名字列表用逗號分隔如下面的代碼所示

  interface INewInterface: IParent IParent { }

  然而與Java不同C#中的接口不能包含域(Field)另外還要注意在C#中接口內的所有方法默認都是公用方法在Java中方法定義可以帶有public修飾符(即使這並非必要)但在C#中顯式為接口的方法指定public修飾符是非法的例如下面的C#接口將產生一個編譯錯誤

  interface IShape { public void Draw( ) ; }

  下面的例子定義了一個名為IControl 的接口接口中包含一個成員方法Paint

  interface IControl {
void Paint( ) ;
}

  在下例中接口 IInterface從兩個基接口 IBase 和 IBase 繼承

  interface IInterface: IBase IBase {
   void Method( ) ;
   void Method( ) ;
}

  接口可由類實現實現的接口的標識符出現在類的基列表中例如

  class Class: Iface Iface {
   // class 成員
}

  類的基列表同時包含基類和接口時列表中首先出現的是基類例如

  class ClassA: BaseClass Iface Iface {
   // class成員
}

  以下的代碼段定義接口IFace它只有一個方法

  interface IFace {
  void ShowMyFace( ) ;
}

  不能從這個定義實例化一個對象但可以從它派生一個類因此該類必須實現ShowMyFace抽象方法

  class CFace:IFace
{
  public void ShowMyFace( )   {
    ConsoleWriteLine( implementation ) ;
   }
}

  基接口
一個接口可以從零或多個接口繼承那些被稱為這個接口的顯式基接口當一個接口有比零多的顯式基接口時那麼在接口的定義中的形式為接口標識符後面跟著由一個冒號:和一個用逗號分開的基接口標識符列表

  接口基
接口類型列表說明

  · 一個接口的顯式基接口必須至少同接口本身一樣可訪問例如在一個公共接口的基接口中指定一個私有或內部的接口是錯誤的

  · 一個接口直接或間接地從它自己繼承是錯誤的

  · 接口的基接口都是顯式基接口並且是它們的基接口換句話說基接口的集合完全由顯式基接口和它們的顯式基接口等等組成在下面的例子中

  interface IControl {
 void Paint( ) ;
}
interface ITextBox: IControl {
 void SetText(string text) ;
}
interface IListBox: IControl {
 void SetItems(string[] items) ;
}
interface IComboBox: ITextBox IListBox { }

  IComboBox 的基接口是IControl ITextBox 和 IlistBox

  · 一個接口繼承它的基接口的所有成員換句話說上面的接口IComboBox就像Paint一樣繼承成

  員SetText 和 SetItems

  · 一個實現了接口的類或結構也隱含地實現了所有接口的基接口

  接口主體
一個接口的接口主體定義接口的成員

  interfacebody:
{   interfacememberdeclarationsopt   }


From:http://tw.wingwit.com/Article/program/net/201311/11751.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.