我是OOP的新手。最近我读到了关于Liskov替代原理的文章。
在下面给出的代码中,Square类继承Give_Area。假设Square类有与正方形相关的操作(如有效性检查)。Give_Area给出了正方形(4个顶点位于一个圆的周长)和一个圆的面积。因此,如果给我一个半径,我必须打印圆圈和正方形的面积(由放置在该圆周上的顶点组成)。为了得到一个圆的面积,我使用了一个参数。但在求正方形面积时不存在参数。因此,我在这里做了超载。
#include<iostream>
#include<cmath>
using namespace std;
class Give_Area
{
public:
double Radius;
double Area(double pi)
{
return pi*Radius*Radius;
}
double Area()
{
double temp = sqrt(2.0)*Radius;
return temp*temp;
}
};
class Square : public Give_Area
{
public:
bool Validity()
{
//checking validity
}
};
int main()
{
Give_Area* area = new Square();
area->Radius = 3.0;
cout<< "Area of Circle: " << area->Area(3.14159) <<endl;
cout<< "Area of Square: " << area->Area() <<endl;
return 0;
}我的问题是。
Is this overloading violating Liskov Substitution Principle?如果这个代码违反了,那么谁能给我一个不违反Liskov替换原则的重载的例子?
我搜索了我的查询,但什么也没找到。:(
提前谢谢。
发布于 2014-12-17 09:15:38
LSP
Liskov代换原理 (或LSP)是关于抽象的。假设有一个类Shape和两个从Shape派生的类Square和Rectangle。现在,Shape有了一个(虚拟)方法getArea()。您会期望它返回(混凝土,实例!)所覆盖的区域!形状,不管它实际上是什么类型。因此,如果在一个getArea()实例上调用Shape,您并不关心它是一个矩形、一个正方形还是任何你能想到的其他形状。
答案
如果没有重载,甚至不需要类似于LSP的东西,也就是说,答案是否定的,重载和LSP并不矛盾。
设计
另一方面,正如帕克斯辉洛所指出的那样,LSP的应用取决于设计。在上面的例子中,这意味着,也许出于某种原因,你确实关心你是否有一个矩形。在这种情况下,LSP说你应该考虑一下你的设计。
你的密码
在这一点上,我不得不承认,我并不真正理解您的代码的目标。有一个Give_Area类,它根据,呃,pi的值来计算圆圈的面积。第二种方法计算以Radius为对角线的正方形?然后是Square类。如果Validity()返回false,这意味着什么?可能是个堕落的广场?我的建议是:重新考虑你的设计。问问自己:“我想要处理的类和对象是什么?”以及“我想要做什么真实世界的物体模型?”
反例
如何违反LSP是演示在维基百科(链接以上)。我将尝试提出第二个例子。假设您有一个带有方法Car的类drive()。派生类(RacingCar,Van,.)当一辆汽车驶入水中(深水、湖泊、大海)时,汽车会发生断裂,下一个车库被称为“车库”。现在,您派生了一个类AmphibiousVehicle。这辆车不会断水,车库也会被称为无用的。你料到了吗?也许是的。但是如果不是,根据进一步的上下文,我会考虑一个类Vehicle,它是Car的基础。它将有一个方法move()。drive()仍然属于Car,它会打电话给move(),并可能在遇到麻烦时(再次;-)呼叫车库。诸若此类。
https://stackoverflow.com/questions/27520300
复制相似问题