gpt4 book ai didi

oop - 这是否解决了 Liskov 替代方矩形违规问题?

转载 作者:行者123 更新时间:2023-12-01 08:03:56 24 4
gpt4 key购买 nike

我对 SOLID 设计原则很陌生。我在理解上遇到问题的一件事是违反 Liskov 替换原则的“方形矩形”示例。为什么正方形的高度/宽度 setter 应该覆盖矩形的 setter ?当存在多态时,这不正是导致问题的原因吗?

去掉这个不能解决问题吗?

class Rectangle
{
public /*virtual*/ double Height { get; set; }
public /*virtual*/ double Width { get; set; }
public double Area() { return Height * Width; }
}

class Square : Rectangle
{
double _width;
double _height;
public /*override*/ double Height
{
get
{
return _height;
}
set
{
_height = _width = value;
}
}
public /*override*/ double Width
{
get
{
return _width;
}
set
{
_width = _height = value;
}
}
}

class Program
{
static void Main(string[] args)
{
Rectangle r = new Square();
r.Height = 5;
r.Width = 6;

Console.WriteLine(r.Area());
Console.ReadLine();
}
}

正如预期的那样,输出是 30。

最佳答案

想象一下,用户正在 GUI 应用程序中实现一个边界框,类似于:

enter image description here

他们想用 Rectangle 来代表这个蓝框类,这样如果用户点击并向下拖动它的高度就会增加;如果用户向右拖动,其宽度将增加。

LSP 规定,客户端应该能够在任何使用其父类(super class)(Rectangle)的地方使用派生类(Square),而不会破坏 Rectangle 的业务逻辑——即用户应该能够为另一个和其余的他们的代码不应该破坏。

但以下内容彼此不兼容:

  • 这是 Rectangle 的假设后置条件,它的 setter 方法不会引起副作用(即 setWidth 不应该影响高度)
  • Square 的逻辑固有的是其宽度将始终等于其高度。

  • 如果程序员使用 Square 而不是 Rectangle,他们上面的假设将不起作用,就好像用户向下拖动一样,框会同时在水平和垂直方向上变大。

    Square/Rectangle 示例的问题在于,我们开始时对 Rectangle 假设太多。矩形的长度可以与其高度不同,但这是特定类型矩形(长方形矩形)的属性。

    一个正方形 矩形,但正方形 不是 一个长方形。如果我们想假设关于我们的 Rectangle 的椭圆的行为类(它的宽度和高度可以不同),这对我们的 Square 没有意义。类来扩展。

    关于oop - 这是否解决了 Liskov 替代方矩形违规问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18142543/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com