solid-principles - Liskov 替换原理示例

标签 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 问题?

最佳答案

在这个特定的例子中,解决方案是不让 Square源自 Rectangle ,因为虽然我们通常说继承是一种"is"关系,但您应该将其视为一种“行为类似”的关系。因此,尽管在数学上,SquareRectangle , 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/

相关文章:

c# - 如何使用受约束的泛型类型参数将类实例化为它派生的接口(interface)

c# - 使用也需要实例化的私有(private)对象实例化类的最佳方法

java - 当我们将职责分为不同的类别时,试图了解SRP

design-patterns - 使用 Zend Framework 2 将数据库列映射到域模型

php - 如何在 PHP 中的子类继承方法中定义更严格的类型?

inheritance - 开闭原则与继承的区别

oop - 添加这个层次类是反模式吗

asp.net-web-api - webapi单一职责原则

JavaScript/TypeScript Array interface[] ,按类型分组以发送多个函数中的 1 个

ios - viewmodel和view如何通信?