Solid principles Liskov替换原理示例

Solid principles Liskov替换原理示例,solid-principles,Solid Principles,LSP对我来说是最难正确理解的 LSP声明程序中的对象应该可以用其子类型的实例替换,而不会改变程序的正确性 如果我们有一个典型的矩形-正方形的例子: rect = new Rectangle(); rect.width = 10; rect.height = 20; 然后我们尝试测试它: assert 10 == rect.width assert 20 == rect.height 一切正常,但当我们试图说正方形也是矩形时,我们使用: rect = new Square(); 正方形

LSP对我来说是最难正确理解的

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

如果我们有一个典型的矩形-正方形的例子:

rect = new Rectangle();

rect.width  = 10;
rect.height = 20;
然后我们尝试测试它:

assert 10 == rect.width
assert 20 == rect.height
一切正常,但当我们试图说正方形也是矩形时,我们使用:

rect = new Square();
正方形实际上具有相同的高度和宽度,这将导致测试失败


那么我们如何解决这个问题呢?我们将Square和Rectangle的类分开,以避免在这种情况下出现LSP问题?

在这个特定示例中,解决方案是不要让Square派生自
Rectangle
,因为尽管我们通常说继承是一种“is a”关系,但您应该将其视为一种“behaves like”关系。因此,尽管从数学上讲,
正方形
是一个
矩形
,但
正方形
的行为肯定不像
矩形
(正如您在上面的代码中所证明的那样)

相反,让它们都从相同的基类派生:

公共抽象类形状{}
公共类广场:形状{
公共整数大小;
}
公共类矩形:Scape{
公众内部高度;
公共权重;
}