- 如果準備爲不相關的類創建一些提供共有功能的東西,請使用接口。
- 抽象類允許你爲子類提供默認功能。
- 如果要爲層次結構中密切相關的對象創建內容,請使用抽象類。
- 如果基類經常更改並且使用了接口替代了抽象類,那麼我們將遇到問題。一旦接口更改,所有實現該接口的類都將被破壞。如果你現在只在項目中使用它們,那麼問題不大。然而一旦發佈到客戶端,這些接口就應該被鎖定。否則那時你將破壞客戶端的代碼。
- 相比接口,抽象類可以有實現。沒有實現的抽象類跟接口沒什麼區別。但是C#允許實現你繼承、實現多個接口,但是隻允許繼承一個基類。
- 接口一旦部署即凍結,你不得更改已部署的接口。如果更改接口那將破壞二進制兼容性,但是隻要你不更改方法簽名就可以擴展抽象類。
- 接口中方法的簽名只能是public,而抽象類中抽象方法可以有public、 protected 、internal、或者protected internal幾種訪問級別。
使用抽象方法
當創建一個將廣泛分發或重用的類庫時(尤其是客戶端),使用優先於接口的抽象類。因爲這能簡化版本控制。這是微軟團隊開發基礎類庫時的慣例(COM除外,因爲COM是圍繞接口設計的)。
使用抽象類爲類型家族定義共同的基類。
使用抽象類提供默認的行爲。
子類只是類邏輯上屬於的層次結構中的基類。
使用接口
當創建一個可以被隨意更改的獨立項目時,使用優先於抽象類的接口,因爲它提供更多的設計靈活性。
使用接口來引入多態行爲而無需子類化並模擬多重繼承 - 允許特定類型支持多種行爲。
使用接口爲值類型設計多態層次結構。
當真正的意圖是協議永遠不變,那麼使用接口。
設計良好的接口定義了一個特定的功能範圍,拆分不包含相關功能的接口。