用着名的Square / Rectangle示例打破Liskov原理给出了逻辑错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用着名的Square / Rectangle示例打破Liskov原理给出了逻辑错误相关的知识,希望对你有一定的参考价值。
我试图用Liskov原理来说明它破坏了它并且在下面的例子中期望当你为sqaure设置宽度时,长度自动设置为相同的长度,反之亦然。但是,该区域返回0.在第二种情况下,我期望4x4 = 16,5x5 = 25。我究竟做错了什么?我怀疑它是在覆盖基类属性的方式。
using System;
public class Rectangle
{
public int length { get; set; }
public int breadth { get; set; }
public int area()
{
return length * breadth;
}
}
public class Square : Rectangle {
public new int length;
public new int breadth;
public new int Length
{
get
{
return this.length;
}
set
{
this.breadth = this.length = value;
}
}
public new int Breadth
{
get
{
return this.breadth;
}
set
{
this.breadth = this.length = value;
}
}
}
public class Program
{
public static void Main()
{
Square s = new Square();
s.length = 4;
s.breadth = 5;
int xx = s.area();
Console.Write(xx);
s.length = 5;
s.breadth = 4;
xx = s.area();
Console.Write(xx);
}
}
当你从base class
继承时,你将继承其所有的Public
和Protected
成员。当您在derived
类中声明具有相同名称的新成员时。编译器会发出警告,询问您是否打算隐藏该成员?当你使用new
关键字时,你告诉编译器:是的我想隐藏这个成员。 area
方法的实现使用base
类properties
,所以它不会看到你的公共Fields
这就是为什么你得到0
。所以你的代码将成为:
public class Rectangle
{
protected int _length;
protected int _breadth;
public virtual int Length
{
get { return _length; }
set { _length = value; }
}
public virtual int Breadth {
get { return _breadth; }
set { _breadth = value; }
}
public int Area()
{
return Length * Breadth;
}
}
public class Square : Rectangle
{
public override int Breadth
{
get { return _breadth; }
set { _breadth = value;
_length = _breadth;
}
}
public override int Length {
get { return _length; }
set { _length = value;
_breadth = _length;
}
}
}
如果你想要override
的东西,你应该在virtual
的base
类定义中添加thing
关键字。在您的示例中,您将导致StackOverFlow
异常。因为每个属性设置者都会调用另一个。这就是为什么我使用受保护的成员来阻止这件事发生的原因。 This是您阅读有关继承的好参考
以上是关于用着名的Square / Rectangle示例打破Liskov原理给出了逻辑错误的主要内容,如果未能解决你的问题,请参考以下文章
python 从着名的github页面同步(需要python3)
python 这个python脚本是着名的Wayback Machine网站存档爬虫的简单命令行实现。
计算形状Shape(圆Circle,矩形Square ,正方形Rectangle)的面积周长
定义抽象类Shape,抽象方法为showArea(),求出面积并显示,定义矩形类Rectangle,正方形类Square,圆类 Circle,根据各自的属性,用showArea方法求出各自的面积,在m