小結:
1. 介面
只有方法名,沒有方法體,由繼承自它的類提供所有方法的實現,C#中規定類只能單繼承,但可以通過介面來實現多繼承,即一個類可以繼承多個不同的介面
2. 定義一個介面
a. 不能定義建構函式
b. 不能定義執行個體成員
c. 不能定義靜態成員
3. 調用介面方法
如:public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>
String繼承了多個介面,拿ICloneable為例, 代碼如下:
String ss = "chine";
ICloneable cloneable = ss;
----cloneable變數只能訪問ICloneable中定義的方法以及ICloneable從繼承鏈上端繼承下來的方法【Object中的方法】,cloneable變數不能訪問String類型中的任何方法
4. 實值型別與介面
像參考型別一樣,實值型別也可以實現0個或多個介面,然而,當轉換實值型別為介面類型時會發生裝箱操作,會產生效能損耗。
5. 明確介面實作(EIMI: explicit interface method implementation)
public interface ITouch { void Too(); } public class Dosome : ITouch { public void Too() { Console.WriteLine("public Too"); } void ITouch.Too()//明確介面實作,前面不能加任何存取修飾詞(如:public,private等) { Console.WriteLine("ITouch Too"); } }----調用: Dosome dosmoe = new Dosome(); dosmoe.Too();//輸出:public Too ITouch itouch = dosmoe; itouch.Too();//輸出:ITouch Too
----明確介面實作只能通過該介面類型變數才能訪問,該介面的實作類別的執行個體變數不能訪問它
----應盡量少使用EIMI
6. 介面與抽象類別的異同
a. 相同點
都不能直接執行個體化,都是通過繼承類來實現其抽象方法。
b. 不同點
介面支援多繼承;抽象類別不支援多繼承
介面只包含方法、屬性、索引器、事件的簽名,但不能定義欄位和包含實現的方法;抽象類別可以定義欄位、屬性、包含有實現的方法
7. 什麼時候用介面,什麼時候用抽象類別【規則與場合】
a. 抽象類別應主要用於關係密切的對象,而介面適合為不相關的類提供通用功能。
b. 介面著重於CAN-DO關聯類型,而抽象類別則偏重於IS-A式的關係。
c. 如果預計會出現版本問題,可以建立"抽象類別"。例如,建立了狗(Dog)、雞(Chicken)和鴨(Duck),那麼應該考慮抽象出動物(Animal)來應對以後可能出現其他種類動物的事情。而向介面中添加新成員則會強制要求修改所有衍生類別,並重新編譯,所以版本式的問題最好以抽象類別來實現。
d. 從抽象類別派生的非抽象類別必須包括繼承的所有抽象方法和抽象訪問器的實現。
e. 對抽象類別不能使用new關鍵字,也不能被密封,原因是抽象類別不能被執行個體化,只能通過繼承類來實現【若密封的話,就不能建立子類了】。
f. 在抽象方法聲明中不能使用 static 或 virtual 修飾符。
g. 如果要設計小而簡練的功能塊,則使用介面。如果要設計大的功能單元,則使用抽象類別。