使用具有实现接口的类参数的方法声明接口

时间:2013-01-06 01:40:46

标签: c++ interface parameters

我想创建一个界面

Coordinate

使用方法

double distanceTo(Coordinate *otherCoord);

但我希望实现该接口的类能够实现各自版本的distanceTo

如果例如GeographicCoordinate实现了Coordinate那么应该强制它实现方法

double distanceTo(GeographicCoordinate *otherCoord);

而不是

double distanceTo(Coordinate *otherCoord);

C ++中用什么语法来表达这个?

2 个答案:

答案 0 :(得分:1)

您需要Curiously recurring template pattern (CRTP)

template<typename DerivedType>
class Coordinate{

    double distanceTo(DerivedType *otherCoord) = 0;

};

class GeographicCoordinate: public Coordinate<GeographicCoordinate>

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

或者你可以这样做,只需double distanceTo(Coordinate *otherCoord);就可以了,通过使关联函数变为虚拟,不需要做模板。

答案 1 :(得分: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; 
   }    
}

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

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