分類索引:C# 語言和運行時剖析--前言
基本概念
一.什么是接口
- CLR中的接口定義:對一組方法進行了統一簽名的類型。
- 從以上定義中可以看出,接口中可以包含的成員包括:
- 方法
- 屬性(本質是方法)
- 事件(本質是方法)
二.為什么使用接口
使用接口是面向抽象編程和解耦合的重要方法。能夠幫助實現五大基本OO原則的以下幾條原則:
- 開放閉合原則,面向接口編程可以靈活的使用實現接口IA的類CB替換類CA,而不用修改CA去滿足新的業務需求。
- 接口復用原則,可以靈活的使用一系列輕量的,不同關注點的接口在不同的業務場合,替換對類的直接引用。
- 依賴反轉原則,高層模塊不直接依賴底層模塊的實現,兩者都依賴抽象編程。
三.接口的修飾
- CLR要求將將接口方法標記為Public
- CLR要求將接口方法標記為virtual
-
- 如果沒有將方法標記為virtual,CLR將自動將該方法標記為virtual和 sealed,這樣,該方法就不能在派生類中重寫。
- 如果顯示的將接口方法標記為virtual,CLR將保持該方法的非密封狀態,這樣,該方法就可以在派生類中重寫。
- 如果派生類需要重寫該接口方法時,就需要在派生類中重新繼承並實現該接口方法。
四.泛型接口
- 泛型接口提供了出色的編譯時類型安全性。非泛型接口在支持多種類型時,往往只能通過object類型的傳遞和返回,不利於對類型的編譯時檢查。
- 泛型接口在處理接口時,裝箱拆箱的幾率要小得多。這個優點同第一個,因為不用可以使用強類型,不用將值類型轉換為object。
- 類可以實現同一個接口若干次,只要每次使用不同的類型參數。例如,類CA可以同時實現 IComparable<int32>, Icomparable<string>.
- 提高了內部方法的可重用性。
接口實現
一.隱式和顯示實現接口
在繼承接口后,右鍵單擊接口名,會出現實現接口與顯示實現接口的命令菜單。兩種方式的區別在於:
- 隱式實現接口方法是默認的接口實現方法,這個時候在實現接口的類CA中,重寫了接口方法。
- 顯示接口方法后,通過接口,例如IDispose.Dispose()方法時,會調用顯示接口方法。
例如:Class CA = new Class();
(IDispose)CA.Dispose()
調用的就是顯示實現接口方法。
二.實現多個具有相同方法名和簽名的接口
加入類CA同時實現接口IA和IB,IA和IB中都具有對方法MethodA的定義,這個時候,就必須用顯示實現接口來區分對兩個接口方法的實現。
三.泛型接口的約束
使用where條件來對泛型接口的參數進行約束。優勢在於:
- 將一個泛型參數約束為多個接口,如果約束為多個接口,則必須傳遞同時實現多個接口的類。
- 傳遞值類型的時候可以減少裝箱操作。
最佳實踐
一.設計基類和接口的時機選擇
- 在設計時,如果體現了"IS-A"的關系,應該考慮使用基類。如果體現了"CAN-DO"的關系,應該考慮使用接口
- 一般來說,基類型更易於使用,代碼重用性更高
- 基類型更能提供一致性的實現和版本控制。
- 在實踐中,最好是兩種方式共同使用,為自己定義的接口提供基類型的默認實現並支持衍生類型的擴展。
二.謹慎使用顯示實現接口
- 顯示實現接口比較容易在實踐中產生混淆。因為不能直接從類型調用,而必須先將類型轉化為接口后調用。
- 顯示實現接口不支持派生類型調用。
三.在接口中的方法需要支持多種參數擴展時,盡量使用泛型接口
- 代碼的復用性更高。
- 將同一類業務對象置於同一個接口下,代碼的內聚性更好。
- 通過不同的參數,可以實現不同的擴展。
相關閱讀