我试图理解is-a vs is-like-一种关系,我在某处读到,我们必须尝试遵循这样的设计,即我们总是拥有is-a关系,而不是is-like-a。考虑一下shape基类和派生的三角形和圆形类的经典示例。所以圆是一种形状,三角形也是一种形状。函数显示区域在基类中定义。现在,下面的程序运行良好。
#include "stdafx.h"
#include <cmath>
#include <iostream>
class shape
{
public:
virtual void displayArea()=0;
};
class circle :public shape
{
int radius;
public:
circle(int radius2) :radius(radius2){ }
void displayArea()
{
double area = 3.14*radius*radius;
std::cout << " \n Area circle" << area<<std::endl;
}
};
class triangle :public shape
{
double a,b,c;
public:
triangle(double a1, double b1, double c1): a(a1), b(b1),c(c1)
{
if (a + b > c && a + c > b && b + c > a)
std::cout << "The sides form a triangle" << std::endl;
else
std::cout << "The sides do not form a triangle. Correct me !" << std::endl;
}
void displayArea()
{
double s = (a + b + c) / 2;
double area = sqrt(s*(s - a)*(s - b)*(s - c));
std::cout << " \n Area triangle"<< area<<std::endl;
}
};
void main()
{
shape * p1[2];
p1[0]= new circle(20);
p1[1] = new triangle(5.6,8.1,10.3);
for (int i = 0; i < 2; ++i)
{
p1[i]->displayArea();
}
int y;
std::cin >> y;
}现在,如果需要实现modifyShape函数,其中形状的每个参数都根据用户的参数进行修改,那么我应该如何更改我的类,以使我的is-a关系不被更改。当我看着它的时候,我觉得我必须在圆形中定义一个参数modifyShape,在三角形中定义一个三参数modifyShape。但是这个函数在基类中应该是什么样子呢?
选项1:我在形状上定义了单参数和双参数modifyShape函数,但这意味着我将在圆形中有一个额外的两个参数函数,在三角形中有一个额外的一个参数函数。
选项2:我在shape中定义了一个可变参数函数modifyShape,但不知何故,这在我看来并不清晰。
发布于 2017-06-21 12:13:15
还有第三个选项可以使用,您可以创建一个新的类(或结构)层次结构,它将表示每个形状的参数。然后,您可以将指向基类的指针作为参数传递给虚函数。例如:
struct ShapeParams
{
...
}
struct TriangleParams : public ShapeParams
{
double a;
double b;
double c:
}
class shape
{
public:
virtual void displayArea()=0;
modifyShape (ShapeParams*) = 0;
};
class triangle :public shape
{
public:
void modifyShape (ShapeParams*) = override;
private:
TriangleParams m_params;
}https://stackoverflow.com/questions/44666561
复制相似问题