介面說明
- 介面為只有宣告成員,而沒有實作的類別
- C#中使用interface來宣告介面
- 介面只能定義屬性、方法、事件、索引,且不包含實作(Implementation)這些成員的程式碼
- 介面可以有0個或多個成員
- 介面的成員只能是屬性、方法、事件、索引子
public interface 介面 { int 屬性 { get; } //屬性 public void 方法(); //方法 event MyEvent 事件; //事件 int this[int index] {get; set;} //索引子 }
- 介面的成員不能是常數、欄位運算子、建構函式、解構函式、型別、靜態成員
- 由類別或結構提供介面的實作
public interface 介面 { string 屬性 { get; set; } string 方法(); } class 類別 : 介面 { private string 欄位 = "Hello"; public string 屬性 { get { return 欄位; } set { this.欄位 = value; } } public string 方法() { return 欄位 + " World"; } }
- 一個類別只能繼承一個父類別,但可以實作(繼承)多個介面
class 類別 : 介面1, 介面2, 介面3 { xxxxx }
- 介面可以繼承多個介面
- 介面不可以被實體化 ⇒ 即不可以new 介面
- 若類別繼承介面,則要實作介面的所有成員
- 若介面B有繼承其它介面A,則繼承介面B的類別需實作介面A和介面B的成員
public interface 介面A { string 方法A(); } public interface 介面B : 介面A { string 方法B(); } class 類別 : 介面B { public string 方法()A { return "實作介面A的方法A"; } public string 方法()B { return "實作介面B的方法B"; } }
- 若介面B有繼承其它介面A,則繼承介面B的類別需實作介面A和介面B的成員
介面的用法
- 下面的例子假設有基本的程式如下:
public interface 介面 { string 方法(); } class 類別A : 介面 { public string 方法() { return "類別A"; } } class 類別B : 介面 { public string 方法() { return "類別B"; } }
- 介面基本用法:
class 類別 { public void 方法1() { 介面 物件 = new 類別A(); System.Console.WriteLine( 物件.方法() ); //顯示:類別A 物件 = new 類別B(); System.Console.WriteLine( 物件.方法() ); //顯示:類別B } }
- 介面進階用法-多型(Polymorphism):
方法2( )是很常使用的寫法,當一個方法傳入的參數可能是不同的類別時,可以讓這些類別繼承某個介面,並將方法的參數型別設為該介面class 類別 { public void 方法2() { 介面 物件 = new 類別A(); 顯示方法(物件); //顯示:類別A 物件 = new 類別B(); 顯示方法(物件); //顯示:類別B } public void 顯示方法(介面 物件) { System.Console.WriteLine( 物件.方法() ); } }