2010-08-25 17 views
2

請使用抽象(MustInherit在Visual Basic中)類而不是接口來將實施與合同分離。需要說明:抽象類首選接口。原因:他們將合同與實施分離

以上是微軟提供的"Type design guideline"。我對此有點困惑。我一直認爲接口將合同與實施解耦。上述準則究竟意味着什麼?

感謝

+2

接口的問題在於,一旦你將它們釋放給公衆,就不能在不破壞所有編譯的情況下更新它。抽象類可以隨時添加非抽象方法而不會破壞任何內容。 – Powerlord 2010-08-25 17:49:33

回答

1

兩個抽象類和接口可以「脫鉤實現合同」。在一個抽象類中,方法可以被聲明爲抽象的,沒有實現,就像使用接口一樣。對於這樣的方法,dervived類必須提供一個帶有實現的Override方法,就像使用接口一樣。

抽象類和接口之間的區別在於抽象類可以包含一些具有實現的成員,然後它們將在所有派生類中共享,並且可以包含私有/受保護的字段(「狀態」 ),界面顯然不能。

+1

是的。我知道抽象類和接口之間的區別。這是如何解釋上述指導原則的? – stackoverflowuser 2010-08-25 17:50:42

1

我認爲這是字面意思。如果你想將契約與實現分開,他們建議你使用抽象類而不是接口。

我明白他們正在做的建議是,當您需要與自定義值類型相關的多態性,或者如果您想要多重繼承,或者因爲類型將有大量的實現者時,您使用接口。例如,IDisposable通常會與多個其他接口一起繼承,而IDisposable則由大量不同的類實現,因此它作爲接口的規則是有意義的。

如果您的合同不會與其他合同一起實施,並且將由8個或10個不同的成員實施,那麼抽象類通過我閱讀的方式是有意義的。

1

接口確實將實施中的合同解耦。您所引用的類型設計指南並不意味着接口對於將契約與實現分離的效果不佳 - 它意味着接口具有抽象類所沒有的額外限制,因此如果您有選擇,這些指南建議您傾斜當你想定義一個沒有實現的合約而不是自動定義一個接口時,定義抽象類。

在設計應用程序內的合同時,這可能是公平的建議。但是,如果合約將在應用程序之外使用,例如通過COM或.NET遠程處理進行的進程調用,或者跨越不同語言(.NET之外),則接口具有明顯的優勢。當你需要絕對的獨立性和實現的獨立性時,接口比抽象類更好。爲了您的應用程序中的方便性和長期靈活性(並且不需要絕對隔離接口),指南建議您可以使用抽象類而不是接口。

準則的措辭部分反映了人們傾向於過度使用接口,這可能會導致不必要的混亂和冗餘實施代碼。