【发布时间】:2015-02-15 16:32:18
【问题描述】:
我是 OOP 的新手。最近我读到了 Liskov Substitution Principle。
在下面给出的代码中,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 替换原则的重载示例吗?
我用谷歌搜索了我的查询,但什么也没找到。 :(
提前致谢。
【问题讨论】:
-
Shape 的属性应该作为成员变量封装在 shape 本身中,而不是作为参数传递给区域获取方法。
-
我实际上可能在这里是少数,但我认为 Liskov 是一件坏事,因为它不必要地限制了你可以做的事情,知道这些东西是如何工作的。见stackoverflow.com/questions/16804817/…。最重要的是,只要您了解您的课程是如何运作的,违反 Liskov 是无关紧要的。
-
不,我的意思是任何形状的属性。整个概念是您可以将一种形状换成另一种形状,调用具有完全相同签名的方法并接收不会破坏您的代码的有效结果。例如,如果我有一个不同类型的形状向量,它们都继承自一个抽象基类,方法是
Area(),我应该能够总结所有形状的总面积,而不管它们是什么形状通过调用每个形状上的 Area() 依次添加到我的总数中。 -
在 C++ 中,方法参数的逆变被视为完全不同的方法(重载),因此要满足 Liskov 替换原则,您需要所有子类具有相同的方法重载。
-
Liskov-Schmiskov:将
π作为参数传递就是我所说的等待发生的事故! (我确定这只是一个例子,但仍然......)
标签: c++ solid-principles liskov-substitution-principle