0

我想创建一个界面

Coordinate

用方法

double distanceTo(Coordinate *otherCoord);

但我希望实现接口的类实现它们各自版本的distanceTo.

如果例如GeographicCoordinate实现Coordinate,则应该强制实现该方法

double distanceTo(GeographicCoordinate *otherCoord);

而不是

double distanceTo(Coordinate *otherCoord);

C++ 中表达这一点的语法是什么?

4

2 回答 2

1

你需要奇怪的重复模板模式(CRTP)

template<typename DerivedType>
class Coordinate{

    double distanceTo(DerivedType *otherCoord) = 0;

};

class GeographicCoordinate: public Coordinate<GeographicCoordinate>

然而,这会使每个基类对派生类都是唯一的,这可能是一个太大的成本(不能存储在容器等中)

或者,您可以这样做,这样double distanceTo(Coordinate *otherCoord);就足够了,通过使相关函数虚拟化,消除制作模板的需要。

于 2013-01-06T01:43:01.530 回答
0

虽然在某些情况下确实需要这样做,但解决此问题的典型方法是在基类中使用虚函数。

例如:

// Example of how to describe a coordinate position - could be many other ways. 
struct PosType { double x; double y };

class Coordinate
{
 public:
    double distanceTo(Coordinate *otherCoord)
    {
        PosType position = getPosition();
        PosType otherPos = otherCoord->getPosition();
        ... use position and otherpos to calculate distance. 
    }
    virtual PosType getPosition() = 0; 
};


class GeographicCoordinate
{
  public:
   PosType getPosition() { return pos; }    

  private: 
   PosType pos; 
}

class SomeOtherCoordinate
{
  public:
   PosType getPosition() 
   { 
      PosType myPos = ... // perform some calculation/transformation. 
      return myPos; 
   }    
}

这样,您可以对任何其他坐标执行任何坐标计算,无论它是什么类型。

显然,可能存在这种解决方案不起作用的情况,但总的来说,我认为它应该起作用。

于 2013-01-06T02:11:22.410 回答