2010-05-14 86 views
4

有人能告訴我這個類結構是否不好?這是不好的面向對象設計嗎? (基類中使用的派生類)

class abstract Parent{ 
    public Child Foo(){ 
    return new Child(); 
    } 
} 

class Child : Parent{} 

我聽說從基礎類型引用派生類型總是不好,並且設計不好。有人可以告訴我爲什麼這是不好的,或者即使它不好?

+0

另外請注意,真實的東西有很多覆蓋和虛擬,並且更少瑣碎,但你明白了。 – Earlz 2010-05-14 00:49:03

+0

你想創建一個流利()。風格()。接口()?如果你是,那麼有更好的方法來做到這一點,仍然有一個合理的耦合水平,更可維護,更容易測試,等等的類結構... http://www.smelser.net/blog/post/ 2009/11/12/Is-my-code-Fluent.aspx – JoeGeeky 2010-05-14 18:12:49

+0

如果基類依賴於子類,那麼這是一個糟糕的設計。看看[依賴倒置原則](http://lostechies.com/gabrielschenker/2009/01/30/the-dependency-inversion-principle/) – Lijo 2014-02-06 19:48:07

回答

4

要詳細說明dkackman的答案,理想情況下,您的工廠將返回子類型的對象,但聲明爲父類型。

class Factory 
{ 
    public Parent Foo() 
    { 
     return new Child(); 
    } 

    public Parent Bar() 
    { 
     return new OtherChild(); 
    } 
} 

其基本思想是你的調用代碼不應該關心它返回哪個子類。這是Liskov替代原則的一個概念。

5

它看起來像我在使用基類作爲工廠。我建議不要這樣設計,因爲它減少了基類(基類和工廠)的內聚性,並增加了基類中的耦合(因爲它引用了派生類)。

創建與基類分開的工廠類,這些問題消失。

1

它在許多層面上肯定會聞起來不好。只要問問自己,如果有人延長孩子會發生什麼;或者它是Parent的另一個子類(而不是Child)。

很難想象一個可以證明這種設計的案例(也許它存在,你可以解釋你想要達到的目標)。 (您是否熟悉工廠模式?)

在任何情況下,爲了獲得這種設計的合理行爲,我想應該接受並接受耦合,甚至嘗試執行它,通過使Child類最終/密封(不可能延長),並將兩個班級作爲一個整體考慮。但是,再次,可以(幾乎肯定)更好地實現另一個更清潔的設計。

+0

好吧,當重新查看代碼庫時,事實證明我們不會大多數情況下不會這樣做。我們唯一擁有的是「這個水平版本,我會編輯我的問題來包含這個 – Earlz 2010-05-14 01:12:03

-1

我不能說你的設計有什麼問題。更具體地說,我必須知道你這樣做的目的。但是無論你的目的是什麼,你都會錯過多態。所以,從客戶端代碼的角度來看,你正在公開超類的細節,以獲得子類實例。我們爲什麼這麼做?至少,我不知道。記住設計原則,我們總是需要一個高度凝聚力的課程。在這裏你通過提供工廠方法來創建一個子類實例來打破這個原則。

rajan

相關問題