2015-11-19 46 views
3

LSP是SOLID中最難以正確理解的。Liskov替代原理示例

LSP指出程序中的對象應該可以用其子類型的實例替換而不會改變程序的正確性。

因此,如果我們有這樣的典型的矩形 - 方形例如:

rect = new Rectangle(); 

rect.width = 10; 
rect.height = 20; 

,然後我們試圖對它進行測試:

assert 10 == rect.width 
assert 20 == rect.height 

一切正常,但當我們試圖說廣場矩形以及我們使用:

rect = new Square(); 

廣場實際上有高度和寬度都相同,這將馬ke測試失敗。

那麼我們如何解決這個問題呢?在這種情況下,我們爲Square和Rectangle分類以避免LSP問題?

回答

4

在這個特殊的例子,解決的辦法是SquareRectangle派生,因爲雖然我們通常說的繼承是一個「是」的關係,你應該看到它作爲一個「行爲就像」的關係。因此,儘管在數學上,SquareRectangle,Square當然不是行爲Rectangle(如你在上面的代碼中證明的)。

相反,讓他們都來自同一個基類派生:

public abstract class Shape { } 

public class Square : Shape { 
    public int Size; 
} 

public class Rectangle : Scape { 
    public int Height; 
    public int Weight; 
} 
相關問題