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 问题?
最佳答案
在这个特定的例子中,解决方案是不让 Square
源自 Rectangle
,因为虽然我们通常说继承是一种"is"关系,但您应该将其视为一种“行为类似”的关系。因此,尽管在数学上,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;
}
关于solid-principles - Liskov 替换原理示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33801214/