超载是否违反利斯科夫替换原则

Does overloading violate Liskov Substitution Principle?

本文关键字:替换 原则 是否 超载      更新时间:2023-10-16

我是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和两个类SquareRectangle派生自Shape。现在Shape有一个(虚拟(方法getArea().您希望它返回(混凝土,实例化!(形状所覆盖的区域,而不管它的实际类型如何。因此,如果您在Shape实例上调用getArea()则无需关心它是矩形、正方形还是您能想到的任何其他形状

答案

如果没有重载,甚至不需要像 LSP 这样的东西,即答案是否定的,重载和 LSP 并不矛盾。

设计

另一方面,正如paxdiablo指出的那样,应用LSP取决于设计。就上面的例子而言,这意味着,也许出于某种原因,您实际上确实关心您是否有一个矩形。好吧,在这种情况下,LSP说你应该考虑你的设计。

您的代码

在这一点上,我不得不承认,我真的不明白你的代码的目标是什么。有一个类Give_Area,它根据 (uh, pi 的值计算卷轴的面积。第二种方法是计算一个以Radius为对角线的正方形?然后是Square类。如果Validity()返回 false,这意味着什么?也许是一个退化的正方形?我的建议是:重新考虑你的设计。问问自己"我想处理哪些类和对象?"和"我想对现实世界的对象进行建模?

反例

如何违反LSP在维基百科上演示(上面的链接(。我将尝试编造第二个例子。假设您有一个带有方法drive()的类Car。派生类(RacingCarVan、...(可以指定速度、加速度等。当汽车驶入水中(深水,湖泊,大海(时,汽车会坏掉,下一个车库被召唤。现在,您派生了一个类AmphibiousVehicle。这个不会在水上破裂,车库将被调用没有用。你期待吗?也许是的。但如果没有,根据进一步的上下文,我会考虑一个类Vehicle它是Car的基础。它将有一个方法move().drive()仍然属于Car会打电话给move(),如果遇到麻烦,可能会打电话(再次;-((车库。等等。