超载是否违反利斯科夫替换原则
Does overloading violate Liskov Substitution Principle?
我是OOP的新手。最近我读了关于利斯科夫替代原理的文章。
在下面给出的代码中,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 替换原则的重载示例吗?
我用谷歌搜索了我的查询,但一无所获。 :(
提前谢谢。
LSP
Liskov的替代原则(或LSP(是关于抽象的。假设一个类Shape
和两个类Square
和Rectangle
派生自Shape
。现在Shape
有一个(虚拟(方法getArea()
.您希望它返回(混凝土,实例化!(形状所覆盖的区域,而不管它的实际类型如何。因此,如果您在Shape
实例上调用getArea()
,则无需关心它是矩形、正方形还是您能想到的任何其他形状。
答案
如果没有重载,甚至不需要像 LSP 这样的东西,即答案是否定的,重载和 LSP 并不矛盾。
设计
另一方面,正如paxdiablo指出的那样,应用LSP取决于设计。就上面的例子而言,这意味着,也许出于某种原因,您实际上确实关心您是否有一个矩形。好吧,在这种情况下,LSP说你应该考虑你的设计。
您的代码
在这一点上,我不得不承认,我真的不明白你的代码的目标是什么。有一个类Give_Area
,它根据 (uh, pi
的值计算卷轴的面积。第二种方法是计算一个以Radius
为对角线的正方形?然后是Square
类。如果Validity()
返回 false,这意味着什么?也许是一个退化的正方形?我的建议是:重新考虑你的设计。问问自己"我想处理哪些类和对象?"和"我想对现实世界的对象进行建模?
反例
如何违反LSP在维基百科上演示(上面的链接(。我将尝试编造第二个例子。假设您有一个带有方法drive()
的类Car
。派生类(RacingCar
、Van
、...(可以指定速度、加速度等。当汽车驶入水中(深水,湖泊,大海(时,汽车会坏掉,下一个车库被召唤。现在,您派生了一个类AmphibiousVehicle
。这个不会在水上破裂,车库将被调用没有用。你期待吗?也许是的。但如果没有,根据进一步的上下文,我会考虑一个类Vehicle
它是Car
的基础。它将有一个方法move()
.drive()
仍然属于Car
会打电话给move()
,如果遇到麻烦,可能会打电话(再次;-((车库。等等。
- 模板参数替换失败,并且未完成隐式转换
- 如何用转义符替换字符串中的所有特殊字符
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 在一个读写器队列中,我可以用volatile替换原子吗
- 用符号版本替换对函数的所有调用
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 替换基于地图的所有引用
- 按平均值替换数组中的元素
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 初始化 std::vector 替换为单大括号而不是双大括号
- С++ wxWidgets:代码架构,设计原则和模式
- 删除/替换C++字符串中的多字符 (ÿû)
- 将 malloc 替换为数组
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 如何在C++中用'\'替换''来处理转义序列?
- 替换密码:哪一个?
- 替换 C++17 中移除的绑定 1st
- 利斯科夫替换原则和多重层次结构
- 超载是否违反利斯科夫替换原则