1. 程式人生 > >【轉】編寫高質量代碼改善C#程序的157個建議——建議102:區分接口和抽象類的應用場合

【轉】編寫高質量代碼改善C#程序的157個建議——建議102:區分接口和抽象類的應用場合

支持 完成 不同 作用 設計 來看 適合 c# 職責

建議102:區分接口和抽象類的應用場合

接口和抽象類有一些顯而易見的區別:

  1. 接口支持多繼承,抽象類則不能。
  2. 接口可以包含方法、屬性、索引器、事件的簽名,但不能有實現,抽象類則可以。
  3. 接口在增加新方法後,所有的繼承者都必須重構,否則編譯不通過,而抽象類則不需要。

這些區別導致兩者的應用場景不同:

  1. 如果對象存在多個功能相近且關系緊密的版本,則使用抽象類。
  2. 如果關系不緊密,但若幹功能擁有共同的聲明,則使用接口。
  3. 抽象類適合於提供豐富功能的場合,接口則更傾向於提供單一的一組功能。

從某種角度來看,抽象類比接口更具備代碼的重用性。子類無須編寫代碼即可具備一個共性的行為。

采用抽象類的另一個好處是,如果為為基類增加一個方法,則繼承該基類的所有子類自然就會具備這個額外的方法,而接口卻不能。如果接口增加一個方法,必須修改所有的子類。所以,接口一旦設計出來就應該是不變的。抽象類則可以隨著版本的升級增加一些功能。

接口的作用更傾向於說明類型具有某個或者某種功能。接口只負責聲明,而抽象基類往往還要負責實現。

接口的職責必須單一,在接口中的方法應該盡可能的簡練。

我們應該在實際設計中,充分考慮到類型的應用場合,根據它所要完成的功能,來決定將類型設計成抽象類還是接口。

轉自:《編寫高質量代碼改善C#程序的157個建議》陸敏技

【轉】編寫高質量代碼改善C#程序的157個建議——建議102:區分接口和抽象類的應用場合