国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#接口知識大全收藏

2019-11-17 03:21:28
字體:
來源:轉載
供稿:網友

C#接口知識大全收藏

第一節 接口慨述

  接口(interface)用來定義一種程序的協定。實現接口的類或者結構要與接口的定義嚴格一致。有了這個協定,就可以拋開編程語言的限制(理論上)。接口可以從多個基接口繼承,而類或結構可以實現多個接口。接口可以包含方法、屬性、事件和索引器。接口本身不提供它所定義的成員的實現。接口只指定實現該接口的類或接口必須提供的成員。

  接口好比一種模版,這種模版定義了對象必須實現的方法,其目的就是讓這些方法可以作為接口實例被引用。接口不能被實例化。類可以實現多個接口并且通過這些實現的接口被索引。接口變量只能索引實現該接口的類的實例。例子:

 1 interface IMyExample { 2  3  string this[int index] { get ; set ; } 4  5  event EventHandler Even ; 6  7  void Find(int value) ; 8  9  string Point { get ; set ; }10 11 }12 13 public delegate void EventHandler(object sender, Event e) ;

  上面例子中的接口包含一個索引this、一個事件Even、一個方法Find和一個屬性Point。

  接口可以支持多重繼承。就像在下例中,接口"IComboBox"同時從"ITextBox"和"IListBox"繼承。

 1 interface IControl { 2  3 void Paint( ) ; 4  5 } 6  7 interface ITextBox: IControl { 8  9 void SetText(string text) ;10 11 }12 13 interface IListBox: IControl {14 15 void SetItems(string[] items) ;16 17 }18 19 interface IComboBox: ITextBox, IListBox { }

  類和結構可以多重實例化接口。就像在下例中,類"EditBox"繼承了類"Control",同時從"IDataBound"和"IControl"繼承。

interface IDataBound {

 void Bind(Binder b) ;

}

public class EditBox: Control, IControl, IDataBound {

 public void Paint( ) ;

 public void Bind(Binder b) {...}

}

  在上面的代碼中,"Paint"方法從"IControl"接口而來;"Bind"方法從"IDataBound"接口而來,都以"public"的身份在"EditBox"類中實現。

  說明:

  1、C#中的接口是獨立于類來定義的。這與 C++模型是對立的,在 C++中接口實際上就是抽象基類。

  2、接口和類都可以繼承多個接口。

  3、而類可以繼承一個基類,接口根本不能繼承類。這種模型避免了 C++的多繼承問題,C++中不同基類中的實現可能出現沖突。因此也不再需要諸如虛擬繼承和顯式作用域這類復雜機制。C#的簡化接口模型有助于加快應用程序的開發。

  4、一個接口定義一個只有抽象成員的引用類型。C#中一個接口實際所做的,僅僅只存在著方法標志,但根本就沒有執行代碼。這就暗示了不能實例化一個接口,只能實例化一個派生自該接口的對象。

  5、接口可以定義方法、屬性和索引。所以,對比一個類,接口的特殊性是:當定義一個類時,可以派生自多重接口,而你只能可以從僅有的一個類派生。

  接口與組件

  接口描述了組件對外提供的服務。在組件和組件之間、組件和客戶之間都通過接口進行交互。因此組件一旦發布,它只能通過預先定義的接口來提供合理的、一致的服務。這種接口定義之間的穩定性使客戶應用開發者能夠構造出堅固的應用。一個組件可以實現多個組件接口,而一個特定的組件接口也可以被多個組件來實現。

  組件接口必須是能夠自我描述的。這意味著組件接口應該不依賴于具體的實現,將實現和接口分離徹底消除了接口的使用者和接口的實現者之間的耦合關系,增強了信息的封裝程度。同時這也要求組件接口必須使用一種與組件實現無關的語言。目前組件接口的描述標準是IDL語言。

  由于接口是組件之間的協議,因此組件的接口一旦被發布,組件生產者就應該盡可能地保持接口不變,任何對接口語法或語義上的改變,都有可能造成現有組件與客戶之間的聯系遭到破壞。

  每個組件都是自主的,有其獨特的功能,只能通過接口與外界通信。當一個組件需要提供新的服務時,可以通過增加新的接口來實現。不會影響原接口已存在的客戶。而新的客戶可以重新選擇新的接口來獲得服務。

  組件化程序設計

  組件化程序設計方法繼承并發展了面向對象的程序設計方法。它把對象技術應用于系統設計,對面向對象的程序設計的實現過程作了進一步的抽象。我們可以把組件化程序設計方法用作構造系統的體系結構層次的方法,并且可以使用面向對象的方法很方便地實現組件。

  組件化程序設計強調真正的軟件可重用性和高度的互操作性。它側重于組件的產生和裝配,這兩方面一起構成了組件化程序設計的核心。組件的產生過程不僅僅是應用系統的需求,組件市場本身也推動了組件的發展,促進了軟件廠商的交流與合作。組件的裝配使得軟件產品可以采用類似于搭積木的方法快速地建立起來,不僅可以縮短軟件產品的開發周期,同時也提高了系統的穩定性和可靠性。

  組件程序設計的方法有以下幾個方面的特點:

  1、編程語言和開發環境的獨立性;

  2、組件位置的透明性;

  3、組件的進程透明性;

  4、可擴充性;

  5、可重用性;

  6、具有強有力的基礎設施;

  7、系統一級的公共服務;

  C#語言由于其許多優點,十分適用于組件編程。但這并不是說C#是一門組件編程語言,也不是說C#提供了組件編程的工具。我們已經多次指出,組件應該具有與編程語言無關的特性。請讀者記住這一點:組件模型是一種規范,不管采用何種程序語言設計組件,都必須遵守這一規范。比如組裝計算機的例子,只要各個廠商為我們提供的配件規格、接口符合統一的標準,這些配件組合起來就能協同工作,組件編程也是一樣。我們只是說,利用C#語言進行組件編程將會給我們帶來更大的方便。

  知道了什么是接口,接下來就是怎樣定義接口,請看下一節--定義接口。

  第二節 定義接口

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

  定義接口的一般形式為:

[attributes] [modifiers] interface identifier [:base-list] {interface-body}[;]

  說明:

  1、attributes(可選):附加的定義性信息。

  2、modifiers(可選): 允許使用的修飾符有 new 和四個訪問修飾符。分別是:new、public、PRotected、internal、 private。在一個接口定義中同一修飾符不允許出現多次,new 修飾符只能出現在嵌套接口中,表示覆蓋了繼承而來的同名成員。The public, protected, internal, and private 修飾符定義了對接口的訪問權限。

  3、指示器和事件。

  4、identifier:接口名稱。

  5、base-list(可選):包含一個或多個顯式基接口的列表,接口間由逗號分隔。

  6、interface-body:對接口成員的定義。

  7、接口可以是命名空間或類的成員,并且可以包含下列成員的簽名: 方法、屬性、索引器 。

  8、一個接口可從一個或多個基接口繼承。

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

interface IShape {

 void Draw ( ) ;

}

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

interface INewInterface: iparent1, IParent2 { }

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

interface IShape { public void Draw( ) ; }

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

interface IControl {

 void Paint( ) ;

}

  在下例中,接口 IInterface從兩個基接口 IBase1 和 IBase2 繼承:

interface IInterface: IBase1, IBase2 {

 void Method1( ) ;

 void Method2( ) ;

}

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

1 class Class1: Iface1, Iface2 {2 3  // class 成員。4    // http://m.survivalescaperooms.com/roucheng/5 }

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

class ClassA: BaseClass, Iface1, Iface2 {

 // class成員。

}

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

interface IFace {

 void ShowMyFace( ) ;

}

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

 1 class CFace:IFace 2  3 { 4  5  public void ShowMyFace( ) { 6  7   Console.WriteLine(" implementation " ) ; 8  9  }10 11 }

  基接口

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

  接口基:

  :接口類型列表說明:

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

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

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

 1 interface IControl { 2  3  void Paint( ) ; 4  5 } 6  7 interface ITextBox: IControl { 8  9  void SetText(string text) ;10 11 }12 13 interface IListBox: IControl {14 15  void SetItems(string[] items) ;16 17 }18 19 interface IComboBox: ITextBox, IListBox { }

  IComboBox 的基接口是IControl, ITextBox, 和 IlistBox。

  4、一個接口繼承它的基接口的所有成員。換句話說,上面的接口 IComboBox 就像Paint一樣繼承成員SetText 和 SetItems。

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

  接口主體

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

interface-body:

{ interface-member-declarationsopt }

  定義接口主要是定義接口成員,請看下一節--定義接口成員。

  第三節 定義接口成員

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

  說明:

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

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

  3、定義一個接口,該接口對于每種可能種類的成員都包含一個:方法、屬性、事件和索引器。

  4、接口成員默認訪問方式是public。接口成員定義不能包含任何修飾符,比如成員定義前不能加abstract,public,protected,internal,private,virtual,override 或static 修飾符。

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

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

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

  8、一個索引器的簽名必須區別于在同一接口中定義的其他所有索引器的簽名。

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

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

  11、接口索引聲明中的屬性(attributes), 類型(type), 和形式參數列表 (formal-parameter-list)與類的索引聲明的那些有相同的意義。

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

 1 interface IMyTest{ 2  3  string this[int index] { get; set; } 4  5  event EventHandler E ; 6  7  void F(int value) ; 8  9  string P { get; set; }10 11 }12 13 public delegate void EventHandler(object sender, EventArgs e) ;

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

public delegate void StringListEvent(IStringList sender);

public interface IStringList

{


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 图木舒克市| 弥勒县| 砀山县| 怀远县| 姚安县| 广南县| 黔江区| 东台市| 台湾省| 阿拉善盟| 高阳县| 武定县| 铅山县| 和平县| 黄平县| 舞阳县| 新兴县| 万全县| 沾益县| 南通市| 巴楚县| 寿光市| 绥德县| 新沂市| 永城市| 密山市| 岳阳市| 西畴县| 东乌| 阿克苏市| 乌拉特后旗| 临邑县| 南川市| 兰溪市| 天气| 拉孜县| 五常市| 登封市| 苍梧县| 武宣县| 苍梧县|