接口類型


 

分類索引:C# 語言和運行時剖析--前言

 

基本概念


 

一.什么是接口

  1. CLR中的接口定義:對一組方法進行了統一簽名的類型。
  2. 從以上定義中可以看出,接口中可以包含的成員包括:
    • 方法
    • 屬性(本質是方法)
    • 事件(本質是方法)

 

二.為什么使用接口

使用接口是面向抽象編程和解耦合的重要方法。能夠幫助實現五大基本OO原則的以下幾條原則:

  1. 開放閉合原則,面向接口編程可以靈活的使用實現接口IA的類CB替換類CA,而不用修改CA去滿足新的業務需求。
  2. 接口復用原則,可以靈活的使用一系列輕量的,不同關注點的接口在不同的業務場合,替換對類的直接引用。
  3. 依賴反轉原則,高層模塊不直接依賴底層模塊的實現,兩者都依賴抽象編程。

 

三.接口的修飾

  1. CLR要求將將接口方法標記為Public
  2. CLR要求將接口方法標記為virtual
    • 如果沒有將方法標記為virtual,CLR將自動將該方法標記為virtualsealed,這樣,該方法就不能在派生類中重寫。
    • 如果顯示的將接口方法標記為virtual,CLR將保持該方法的非密封狀態,這樣,該方法就可以在派生類中重寫。
    • 如果派生類需要重寫該接口方法時,就需要在派生類中重新繼承並實現該接口方法。

 

四.泛型接口

  1. 泛型接口提供了出色的編譯時類型安全性。非泛型接口在支持多種類型時,往往只能通過object類型的傳遞和返回,不利於對類型的編譯時檢查。
  2. 泛型接口在處理接口時,裝箱拆箱的幾率要小得多。這個優點同第一個,因為不用可以使用強類型,不用將值類型轉換為object。
  3. 類可以實現同一個接口若干次,只要每次使用不同的類型參數。例如,類CA可以同時實現 IComparable<int32>, Icomparable<string>.
  4. 提高了內部方法的可重用性。

 

接口實現


一.隱式和顯示實現接口

在繼承接口后,右鍵單擊接口名,會出現實現接口與顯示實現接口的命令菜單。兩種方式的區別在於:

  1. 隱式實現接口方法是默認的接口實現方法,這個時候在實現接口的類CA中,重寫了接口方法。
  2. 顯示接口方法后,通過接口,例如IDispose.Dispose()方法時,會調用顯示接口方法。

            例如:Class CA = new Class();

                       (IDispose)CA.Dispose()

          調用的就是顯示實現接口方法。

 

二.實現多個具有相同方法名和簽名的接口

加入類CA同時實現接口IA和IB,IA和IB中都具有對方法MethodA的定義,這個時候,就必須用顯示實現接口來區分對兩個接口方法的實現。

 

三.泛型接口的約束

使用where條件來對泛型接口的參數進行約束。優勢在於:

  1. 將一個泛型參數約束為多個接口,如果約束為多個接口,則必須傳遞同時實現多個接口的類。
  2. 傳遞值類型的時候可以減少裝箱操作。

 

最佳實踐


一.設計基類和接口的時機選擇

  1. 在設計時,如果體現了"IS-A"的關系,應該考慮使用基類。如果體現了"CAN-DO"的關系,應該考慮使用接口
  2. 一般來說,基類型更易於使用,代碼重用性更高
  3. 基類型更能提供一致性的實現和版本控制。
  4. 在實踐中,最好是兩種方式共同使用,為自己定義的接口提供基類型的默認實現並支持衍生類型的擴展。

 

二.謹慎使用顯示實現接口

  1. 顯示實現接口比較容易在實踐中產生混淆。因為不能直接從類型調用,而必須先將類型轉化為接口后調用。
  2. 顯示實現接口不支持派生類型調用。

 

三.在接口中的方法需要支持多種參數擴展時,盡量使用泛型接口

  1. 代碼的復用性更高。
  2. 將同一類業務對象置於同一個接口下,代碼的內聚性更好。
  3. 通過不同的參數,可以實現不同的擴展。

 

相關閱讀


[你必須知道的.NET]第二十七回:interface到底繼承於object嗎?

[你必須知道的.NET] 第二回:對抽象編程:接口和抽象類

深入繼承 - 抽象類和接口

面向接口編程詳解(一)——思想基礎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM