Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载是否违反了Liskov替换原则?_C++_Solid Principles_Liskov Substitution Principle - Fatal编程技术网

C++ 重载是否违反了Liskov替换原则?

C++ 重载是否违反了Liskov替换原则?,c++,solid-principles,liskov-substitution-principle,C++,Solid Principles,Liskov Substitution Principle,我是OOP的新手。最近我读到了关于Liskov替换原理的文章 在下面给出的代码中,Square类继承了Give\u Area。假设Square类与一个Square相关(比如有效性检查)给出面积给出正方形的面积(4个顶点位于圆的周长上)和圆的面积。因此,如果给我一个半径,我必须打印圆和正方形的面积(由放置在圆周长上的顶点组成)。为了得到圆的面积,我使用了一个参数。但在求平方面积时没有参数。因此,我在这里做了重载 #include<iostream> #include<cmath&

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

在下面给出的代码中,Square类继承了Give\u Area。假设Square类与一个Square相关(比如有效性检查)给出面积给出正方形的面积(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;
}
如果这个代码违反了,那么有人能给我举一个不会违反Liskov替换原则的重载的例子吗

我在谷歌上搜索了我的查询,但什么也没找到(

提前感谢。

LSP (或LSP)是关于抽象的。想象一个类
Shape
和两个类
Square
Rectangle
派生自
Shape
。现在
Shape
有一个(虚拟)方法
getArea()
。你会期望它返回(具体的,实例化的!)所覆盖的区域因此,如果在
shape
实例上调用
getArea()
,则不管它是矩形、正方形还是任何你能想到的其他形状

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

设计 另一方面,正如paxdiablo所指出的,应用LSP取决于设计。在上面的例子中,这意味着,可能出于某种原因,你确实关心是否有矩形。那么,LSP说你应该考虑你的设计

你的代码 我必须承认,在这一点上,我真的不明白你的代码的目的是什么。有一个类
Give_Area
,它根据,呃,
pi
的值来计算圆环的面积。第二个方法计算一个以
半径
为对角线的正方形?然后是
正方形
类。如果
有效ity()
返回false,这意味着什么?可能是退化的正方形?我的建议是:重新考虑您的设计。问问自己“我想处理的类和对象是什么?”和“我想处理的真实对象是什么?”

反例
如何违反LSP已在维基百科(上面的链接)上演示。我将尝试制作第二个示例。假设您有一个使用方法
drive()
的类
Car
。派生类(
RacingCar
Van
,…)可以指定汽车驶入水中(深水、湖泊、大海)时的速度、加速度等这辆车会坏掉,下一个车库会被调用。现在你衍生出一辆class
两栖车
。这辆车不会在水上坏掉,车库会被调用而没有任何用处。你预料到了吗?也许是。但如果不是,根据进一步的上下文,我会考虑一辆class
,它是
的基础。它会ld有一个方法
move()
。和
drive()
,它仍然属于
Car
,它将调用
move()
,并可能在出现故障时(再次;-)调用车库。

形状的属性应该被封装在形状本身中作为成员变量,而不是作为获取方法的区域的参数。我可能实际上是少数人,但我认为Liskov是一个坏东西,因为它限制了你所能做的不必要的事情,知道这些东西是如何工作的。看见Boottom line,如果你了解你的类是如何工作的,违反Liskov是不相关的。不,我指的是任何形状的属性。整个概念是,您可以将一个形状替换为另一个形状,调用具有完全相同签名的方法,并接收不会破坏代码的有效结果。例如,如果我有一个不同类型的形状向量,所有这些形状都是通过一个名为
Area()依次将每个形状加在我的总数中。在C++中,方法参数被视为完全不同的方法(重载),因此,为了满足Liskov替换原则,您需要所有子类都具有相同的方法重载。Liskov-Schmiskov:passing
π
作为参数就是我所说的等待发生的意外!(我相信这只是一个例子,但仍然…)首先,谢谢你的回答。实际上我只是想重载一个方法。我写这段代码只是作为一个例子。该代码没有任何意义。由于我是OOP的新手,我无法找出重载和LSP是否矛盾。好的,现在我知道了,重载和LSP并不矛盾。现在你能给我举个例子,LSP和重载同时发生吗?提前谢谢。只是想熟悉一下这样的例子。谢谢您的编辑。:)现在我明白了。:)很好的回答。:)
Is this overloading violating Liskov Substitution Principle?