首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >超载是否违反Liskov替代原则?

超载是否违反Liskov替代原则?
EN

Stack Overflow用户
提问于 2014-12-17 07:29:03
回答 1查看 1.2K关注 0票数 5

我是OOP的新手。最近我读到了关于Liskov替代原理的文章。

在下面给出的代码中,Square类继承Give_Area。假设Square类有与正方形相关的操作(如有效性检查)。Give_Area给出了正方形(4个顶点位于一个圆的周长)和一个圆的面积。因此,如果给我一个半径,我必须打印圆圈和正方形的面积(由放置在该圆周上的顶点组成)。为了得到一个圆的面积,我使用了一个参数。但在求正方形面积时不存在参数。因此,我在这里做了超载。

代码语言:javascript
复制
#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;
}

我的问题是。

代码语言:javascript
复制
Is this overloading violating Liskov Substitution Principle?

如果这个代码违反了,那么谁能给我一个不违反Liskov替换原则的重载的例子?

我搜索了我的查询,但什么也没找到。:(

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-17 09:15:38

LSP

Liskov代换原理 (或LSP)是关于抽象的。假设有一个类Shape和两个从Shape派生的类SquareRectangle。现在,Shape有了一个(虚拟)方法getArea()。您会期望它返回(混凝土,实例!)所覆盖的区域!形状,不管它实际上是什么类型。因此,如果在一个getArea()实例上调用Shape,您并不关心它是一个矩形、一个正方形还是任何你能想到的其他形状。

答案

如果没有重载,甚至不需要类似于LSP的东西,也就是说,答案是否定的,重载和LSP并不矛盾。

设计

另一方面,正如帕克斯辉洛所指出的那样,LSP的应用取决于设计。在上面的例子中,这意味着,也许出于某种原因,你确实关心你是否有一个矩形。在这种情况下,LSP说你应该考虑一下你的设计。

你的密码

在这一点上,我不得不承认,我并不真正理解您的代码的目标。有一个Give_Area类,它根据,呃,pi的值来计算圆圈的面积。第二种方法计算以Radius为对角线的正方形?然后是Square类。如果Validity()返回false,这意味着什么?可能是个堕落的广场?我的建议是:重新考虑你的设计。问问自己:“我想要处理的类和对象是什么?”以及“我想要做什么真实世界的物体模型?”

反例

如何违反LSP是演示在维基百科(链接以上)。我将尝试提出第二个例子。假设您有一个带有方法Car的类drive()。派生类(RacingCarVan,.)当一辆汽车驶入水中(深水、湖泊、大海)时,汽车会发生断裂,下一个车库被称为“车库”。现在,您派生了一个类AmphibiousVehicle。这辆车不会断水,车库也会被称为无用的。你料到了吗?也许是的。但是如果不是,根据进一步的上下文,我会考虑一个类Vehicle,它是Car的基础。它将有一个方法move()drive()仍然属于Car,它会打电话给move(),并可能在遇到麻烦时(再次;-)呼叫车库。诸若此类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27520300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档