我通常會試圖確保我的對象實例符合Liskov Substitution Principle,但我一直在想,人們是否認爲LSP也適用於構造函數?施工人員是否應遵守Liskov替代原則?
我已經嘗試了谷歌搜索這個,但我一直沒能找到任何強烈的意見任何方式。
我應該注意到我的大部分代碼都是在Ruby中,但我有時會發現我的子類構造函數與父類稍有不同。他們採用相同的基本參數集,通常還有額外的參數。有時候,其他類方法也會發生這種情況。
在我的腦海裏,這總感覺像是違反了LSP,但我想看看是否有其他人也這樣認爲。
「當您使用構造函數時,您知道您正在處理子類型。」謝謝。這是一個很好的觀點。 – Chance 2011-05-25 15:28:06
區分構造函數,靜態工廠方法,作爲正在生成的類型實例的工廠方法(最顯着的是'Clone')和其他工廠可能很重要。靜態工廠可能產生不同類型的從返回類型派生的對象,但LSP應該適用於所有產生的對象;但是,沒有要求,派生類支持與基類相同的靜態方法。如果一個類支持像Clone這樣的工廠方法,那麼應該遵循LSP並且支持子類型中的類似語義。 – supercat 2011-12-23 15:21:04
對於返回其他類型的東西的工廠,從派生工廠返回的項目應該可用作從基本工廠返回的項目的實例。所以如果'CarFactory'有一個返回'Car'的'MakeCar()'方法,後者又支持'Drive()'方法,那麼應該可以調用'SomeCarFactory.MakeCar()。Drive()',即使'SomeCarFactory'實際上是一個'FordFactory'(繼承'CarFactory'),它返回一個'Ford'(繼承'Car')。 – supercat 2011-12-23 15:28:49