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问题吗?
答案 0 :(得分:4)
在这个特定的例子中,解决方案是不让Square
派生自Rectangle
,因为虽然我们通常说继承是'是'关系',你应该把它视为一种“表现得像”的关系。因此,虽然在数学上,Square
是Rectangle
,但Square
肯定不会表现,就像Rectangle
一样(正如您在上面的代码中所证明的那样) )。
相反,让它们都来自相同的基类:
public abstract class Shape { }
public class Square : Shape {
public int Size;
}
public class Rectangle : Scape {
public int Height;
public int Weight;
}