利斯科夫替代原则的例子

时间:2015-11-19 10:27:01

标签: solid-principles

LSP是SOLID中最难以正确理解的。

LSP声明程序中的对象应该可以替换其子类型的实例,而不会改变程序的正确性。

因此,如果我们有这个典型的矩形 - 方形示例:

rect = new Rectangle();

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

然后我们尝试测试它:

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

一切都很好,但是当我们试图说方形是矩形时我们也会使用:

rect = new Square();

Square实际上高度和宽度都相同,这将使测试失败。

那么我们如何解决这个问题呢?我们选择Square和Rectangle的类来避免LSP问题吗?

1 个答案:

答案 0 :(得分:4)

在这个特定的例子中,解决方案是Square派生自Rectangle,因为虽然我们通常说继承是'是'关系',你应该把它视为一种“表现得像”的关系。因此,虽然在数学上,SquareRectangle,但Square肯定不会表现,就像Rectangle一样(正如您在上面的代码中所证明的那样) )。

相反,让它们都来自相同的基类:

public abstract class Shape { }

public class Square : Shape { 
    public int Size;
}

public class Rectangle : Scape { 
    public int Height;
    public int Weight;
}