2013-12-12 29 views
5

當我遇到這個問題時answer was proposed to another question I asked。假設我有一個基類我應該如何積極地繼承以保持DRY?

public abstract class BaseClass {} 

有一些體面的派生類 - 比方說超過六打。大多數這些派生類的不共享相似性超出了他們的從基類繼承的東西,但他們兩個都像這樣

public class OneOfMyDerivedClasses : BaseClass 
{ 
    public string SimilarProperty {get; set;} 
    //Other implementation details 
} 

public class AnotherOneOfMyDerivedClasses : BaseClass 
{ 
    public string SimilarProperty {get; set;} 
    //Other implementation details, dissimilar to those in OneOfMyDerivedClasses 
} 

就是這樣的相似性。這是唯一的相似之處,任何子類共享超越從BaseClass繼承。在我的實際應用中,我用界面IHaveSimilarProperty解決了這個問題,因爲我所關心的只是一個對象實現了所使用的接口。但因爲我有重複,我應該定義這兩個派生類繼承中間基類,即

public abstract IntermediateBaseClass : BaseClass 
{ 
    public string SimilarProperty {get; set;} 
} 

我也可以結合這兩種方法,裝潢中間階層,界面...

所以我的問題是關於這是否足夠的重複,以保證OOP最佳實踐方面的中間基類。我是否應該積極消除所有重複,或者我應該採取更務實的方法?如果是後者,那麼推動我選擇另一種方法的經驗法則是什麼?

+0

在這種情況下你需要多態嗎? – Matthew

+4

我認爲這將主要是基於意見而沒有具體的例子。就我個人而言,我的設計決定基於對象所代表的內容而非其屬性。這是應該改變你的代碼更適應性。 – Liath

+0

我想說,不,這種情況不保證另一個基類。如果使用接口符合要求,那麼最好不要過度設計。 – Zach

回答

4

任何設計模式都可以採取極端。下面是決定是否子類時要使用的一些一般準則:

  • 代碼量是否相對較大(> 10行)?
  • 將代碼需要
  • 我將需要使用多態(是否有意義使用基地類或接口,而不是子類之一)

週期性變化(如業務規則)在你的情況下,因爲唯一的相似性似乎是在兩個類中都具有相同名稱的屬性,所以它可能不值得子類化。

+5

子類不僅「不值得」,而且如果子類不是這樣並不真正代表基類的專用版本。 「重複使用」決不應該成爲繼承的原因。 –

2

這很好,積極消除每一次的重複,但你的#1工具這樣做是組成,而不是繼承。當需要多態時使用繼承,當需要重用時使用組合。

...但如果問題中的「重複」只是一個屬性,那麼也許不用擔心。重構的黃金法則是每個重構都應該讓你的生活更美好,而不是更糟糕。如果沒有,你做錯了。

4

你應該基於你的類的普通語義來決定子類,而不僅僅是它們的公共屬性。共享一個共同的屬性不足以保證一箇中間通用的子類,但共享一個共同的語義肯定就足夠了。

下面是一個例子:一個RectangleCircle類可以具有稱爲Center屬性,但它並不意味着這兩個類應該有一個共同的子類(除了抽象Shape,可能不一定具有Center )。在這種情況下,接口IWithCenter適合更好。類似地,LabelTextField可能具有Text屬性,但在這種情況下,即使通用接口也是不合理的。