Solid principles Liskov替换原理示例
LSP对我来说是最难正确理解的 LSP声明程序中的对象应该可以用其子类型的实例替换,而不会改变程序的正确性 如果我们有一个典型的矩形-正方形的例子: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(); 正方形
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{
公众内部高度;
公共权重;
}