正确实施继承

时间:2016-12-09 13:24:08

标签: c++ inheritance geometry distance

给出以下课程:

class Geometry {
  public:
    double distanceBetweenGeometries(const Geometry& g);
  private:        
    Shape myShape;
};

class Shape {
  public:
    double distance(const Shape& s1, const Shape& s2);
};

class Rectangle : public Shape {
  private:
    double i,j,length,width;
};

class Circle : public Shape {
  private:
    double i,j,radius;
};

因此每个几何体都具有RectangleCircle类型的形状。在我的程序中,我需要计算两个几何之间的(欧几里得)距离。因此,给定两个几何g1g2,我调用

g1.distanceBetweenGeometries(g2);

我希望返回g1.myShapeg2.myShape之间的距离。

我已经知道如何计算两个矩形,两个圆之间或矩形和圆之间的距离。不知何故,我没有实现面向对象的解决方案来实现距离函数。

我的想法是:从给定的几何体调用距离函数。该距离函数调用形状的距离函数。在Shape::distance(..)我不知何故需要区分s1s2类型。之后,我必须选择正确的数学公式来计算它们之间的距离。你能否告诉我,我的继承理念是否足够,以及如何实现Shape::distance(..)函数,以便它可以自动确定请求距离计算的公式?

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

class Circle;
class Rectangle;

// Your existing methods to do the real computation:
double distanceRC(const Rectangle&, const Circle&);
double distanceRR(const Rectangle&, const Rectangle&);
double distanceCC(const Circle&, const Circle&);

class Shape {
public:
    virtual ~Shape() = default;
    virtual double distanceWith(const Shape&) const = 0;
    virtual double distanceWith(const Rectangle&) const = 0;
    virtual double distanceWith(const Circle&) const = 0;
};

class Rectangle : public Shape {
public:
    double distanceWith(const Shape& s) const override { return s.distanceWith(*this); }
    double distanceWith(const Rectangle& r) const override { return distanceRR(*this, r);}
    double distanceWith(const Circle& c) const override { return distanceRC(*this, c); }
private:
    double i,j,length,width;
};

class Circle : public Shape {
public:
    double distanceWith(const Shape& s) const override { return s.distanceWith(*this); }
    double distanceWith(const Rectangle& r) const override { return distanceRC(r, *this);}
    double distanceWith(const Circle& c) const override { return distanceCC(*this, c); }
private:
    double i,j,radius;
};