2015-04-23 51 views
4

Liskov Substitution Principle(LSP)指出,如果一個對象o1是S的一種類型,並且它可以代替對象o2,而這個對象是一個T類型的對象,並且不違反其所有用戶的原始行爲,那麼S是一個T的子類型。如果違反Liskov替代原則,我該怎麼辦?

用於顯示LSP違例的常見示例是矩形及其派生類型Square。我們的觀點是,雖然直覺上Square看起來是Rectangle的子類型,但是有一些與Rectangle不同的Square的行爲。結論是,Square不能通過LSP來成爲Rectangle的子類型。

我發現的所有解釋在那裏結束,我發現它沒有幫助。我想知道如果我有這個問題該怎麼辦?創建S不是T的子類型,然後呢?我有什麼解決方案來解決它?

有人可以請賜我一個懸而未決的問題的答案嗎?

編輯:我不是在這裏詳細說明這個例子,而是我把這個article轉給你。

+3

'有一些與矩形不同的方形行爲? – deviantfan

+0

這些差異是否與您的情況相關?如果沒有,你仍然可以從矩形派生出正方形。 – Martze

+0

@deviantfan:'mySquare.Length = 5;'也設置寬度爲5,而'myRectangle.Length = 5;'不寬度爲5 – Jonny

回答

2

您可以使用「有一個」「使用」關係,如果你不能建立「是」關係。

這意味着,而不是從A類B類繼承,你可以有B類包含A類的實例,這也是很好的編碼習慣,以避免A類和B類

0

之間的緊耦合如果你的類違反了LSP不是從基類派生的合適的候選者,那麼LSP是「is-a」關係的更精確的定義。這是一個信號,說明您的設計有問題。

有兩點需要注意:違反LSP將打破基類而不是派生類,這在遺留代碼中非常危險,只有很少的測試覆蓋率,有一個明確的「is-a」關係在數學世界(如正方形和矩形)中,他們可能不會在應用程序的領域中分享這種關係。

0

您可以將通用屬性提取到接口或抽象類型中,並將其用作基礎。差異仍然可以在派生類型中實現。

這樣你保持你的IS關係。

1

這個問題是在這本書有效C++第三版斯科特邁爾斯,艾迪生韋斯利2005年5月在第6章,項目審查32.

有邁爾斯使得樣本類矩形和類方形它繼承了第一併廣泛談論使用斷言引發的問題。

項目的結論是:

「公有繼承意味着‘是一個適用於基礎 類也必須適用於派生類’一切,因爲每一個派生 類對象是一個基類對象。 「。

目前這本書可以在互聯網上找到或購買。

+0

與本書參考很好的搭配 – noobed

0

的教訓,從LSP學習和rectange /平方的例子是,IS_A無關用數學或生物學或任何憑直覺顯然IS_A看起來。

IS_A完全是一種行爲關係。 Square不是OOP中的矩形,因爲它沒有相同的行爲。但矩形具有與正方形相同的行爲加上一些額外的不違反任何正方形行爲的行爲。因此,在OOP矩形IS_A平方米,即使它違背數學和直覺,它也是非常有意義的。

相關問題