有人能告訴我這個類結構是否不好?這是不好的面向對象設計嗎? (基類中使用的派生類)
class abstract Parent{
public Child Foo(){
return new Child();
}
}
class Child : Parent{}
我聽說從基礎類型引用派生類型總是不好,並且設計不好。有人可以告訴我爲什麼這是不好的,或者即使它不好?
有人能告訴我這個類結構是否不好?這是不好的面向對象設計嗎? (基類中使用的派生類)
class abstract Parent{
public Child Foo(){
return new Child();
}
}
class Child : Parent{}
我聽說從基礎類型引用派生類型總是不好,並且設計不好。有人可以告訴我爲什麼這是不好的,或者即使它不好?
要詳細說明dkackman的答案,理想情況下,您的工廠將返回子類型的對象,但聲明爲父類型。
class Factory
{
public Parent Foo()
{
return new Child();
}
public Parent Bar()
{
return new OtherChild();
}
}
其基本思想是你的調用代碼不應該關心它返回哪個子類。這是Liskov替代原則的一個概念。
它看起來像我在使用基類作爲工廠。我建議不要這樣設計,因爲它減少了基類(基類和工廠)的內聚性,並增加了基類中的耦合(因爲它引用了派生類)。
創建與基類分開的工廠類,這些問題消失。
它在許多層面上肯定會聞起來不好。只要問問自己,如果有人延長孩子會發生什麼;或者它是Parent的另一個子類(而不是Child)。
很難想象一個可以證明這種設計的案例(也許它存在,你可以解釋你想要達到的目標)。 (您是否熟悉工廠模式?)
在任何情況下,爲了獲得這種設計的合理行爲,我想應該接受並接受耦合,甚至嘗試執行它,通過使Child類最終/密封(不可能延長),並將兩個班級作爲一個整體考慮。但是,再次,可以(幾乎肯定)更好地實現另一個更清潔的設計。
好吧,當重新查看代碼庫時,事實證明我們不會大多數情況下不會這樣做。我們唯一擁有的是「這個水平版本,我會編輯我的問題來包含這個 – Earlz 2010-05-14 01:12:03
我不能說你的設計有什麼問題。更具體地說,我必須知道你這樣做的目的。但是無論你的目的是什麼,你都會錯過多態。所以,從客戶端代碼的角度來看,你正在公開超類的細節,以獲得子類實例。我們爲什麼這麼做?至少,我不知道。記住設計原則,我們總是需要一個高度凝聚力的課程。在這裏你通過提供工廠方法來創建一個子類實例來打破這個原則。
rajan
另外請注意,真實的東西有很多覆蓋和虛擬,並且更少瑣碎,但你明白了。 – Earlz 2010-05-14 00:49:03
你想創建一個流利()。風格()。接口()?如果你是,那麼有更好的方法來做到這一點,仍然有一個合理的耦合水平,更可維護,更容易測試,等等的類結構... http://www.smelser.net/blog/post/ 2009/11/12/Is-my-code-Fluent.aspx – JoeGeeky 2010-05-14 18:12:49
如果基類依賴於子類,那麼這是一個糟糕的設計。看看[依賴倒置原則](http://lostechies.com/gabrielschenker/2009/01/30/the-dependency-inversion-principle/) – Lijo 2014-02-06 19:48:07