C#中的介面 在C#中介面是一組公共方法或屬性的集合。介面可以被其他介面或是類繼承,但不能被實例化。 1、介面中包含的屬性和方法都是公共的,不是繼承或是私有的。事實上,在C#中定義介面中的成員時,不允許顯示指定介面成員的可訪問性,而是自動預設為公共的。 2、介面中只能包含普通方法或屬性,而不能包含其
C#中的介面
在C#中介面是一組公共方法或屬性的集合。介面可以被其他介面或是類繼承,但不能被實例化。
1、介面中包含的屬性和方法都是公共的,不是繼承或是私有的。事實上,在C#中定義介面中的成員時,不允許顯示指定介面成員的可訪問性,而是自動預設為公共的。
2、介面中只能包含普通方法或屬性,而不能包含其他內容,如構造函數、變數等。
3、當介面被某個類繼承時,通常說類實現了這個介面,而較少說類繼承了介面。
4、介面中的方法和屬性只有簽名部分,而沒有實現部分,甚至連介面名後面的大括弧也不能有,否則會出現編譯錯誤。
在C#中用interface關鍵字定義一個介面
訪問修飾符 interface 介面名
{
//介面成員(方法和屬性)
}
C#中約定介面的名字以字母I開頭。如以下代碼定義一個介面IPerson
1 public interface IPerson 2 { 3 void eat(object food); //介面的方法 4 void speak(string text); //介面的方法 5 6 string name //介面的屬性 7 { 8 get; 9 set; 10 } 11 }
如前所述,介面中不允許定義變數、構造函數,不能顯示指定介面中方法或屬性的可訪問性。
介面可以被類或者別的介面繼承。類繼承介面的語法與類繼承類的語法相同,都是在類名後面加冒號和要繼承的介面名,如下:
訪問修飾符 class 類名:介面名
{
//類與介面的成員
}
類繼承介面與類繼承類的不同之處在於一個類可以同時繼承多個介面,但只能從一個類繼承。當一個類繼承多個介面時,多個介面之間用逗號隔開,如下:
訪問修飾符 class 類名:[基類名][,介面1][,介面2][...][,介面n]
{
//類與介面成員
}
介面繼承介面與類繼承介面語法類似,只是定義介面時使用關鍵字interface。
訪問修飾符 interface 介面名:[介面1][,介面2][,介面3][...][,介面n]
{
//介面成員
}
如果一個類從介面繼承,那麼這個類必須要實現介面中定義的所有方法和屬性。由於介面定義了方法和屬性的簽名,而這些方法和屬性的具體實現代碼是在從介面繼承的類里寫,所以當一個類從介面繼承時,通常說一個類實現了某個介面。
這裡所說的實現有兩層含義:首先說明類繼承於介面,其次,類中用代碼實現了介面中定義的方法和屬性。
如果一個類實現了一個介面,由於類繼承自介面,所以類可以隱式轉換為介面,這與派生類向基類隱式轉換是一樣的。如果一個類實現了多個介面,那麼類可以隱式轉換為其中任意一個介面。
1 public interface IPerson 2 { 3 void eat(object food); //介面的方法 4 void speak(string text); //介面的方法 5 6 string name //介面的屬性 7 { 8 get; 9 set; 10 } 11 } 12 13 public class Student:IPerson 14 { 15 16 public void eat(object food) 17 { 18 Console.WriteLine(name + " eat: " + food.ToString()); 19 } 20 21 public void speak(string text) 22 { 23 Console.WriteLine(name + " say: " + text); 24 } 25 26 private string _name; 27 public string name 28 { 29 get 30 { 31 return _name; 32 } 33 set 34 { 35 _name = value; 36 } 37 } 38 } 39 static void Main(string[] args) 40 { 41 IPerson person; 42 Console.WriteLine("Main: 通過介面調用方法"); 43 person = new Student(); 44 person.name = "Nick"; 45 person.eat("apple"); 46 person.speak("Hello"); 47 Console.WriteLine("Main: 通過類調用方法"); 48 Student s = new Student(); 49 s.name = "Jessice"; 50 s.eat("rice"); 51 s.speak("Hehe"); 52 53 Console.ReadLine(); 54 }
結果
Main: 通過介面調用方法
Nick eat: apple
Nick say: Hello
Main: 通過類調用方法
Jessice eat: rice
Jessice say: Hehe