我想创建一个界面
Coordinate
使用方法
double distanceTo(Coordinate *otherCoord);
但我希望实现该接口的类能够实现各自版本的distanceTo
。
如果例如GeographicCoordinate
实现了Coordinate
那么应该强制它实现方法
double distanceTo(GeographicCoordinate *otherCoord);
而不是
double distanceTo(Coordinate *otherCoord);
C ++中用什么语法来表达这个?
答案 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;
}
}
这样,您可以对任何其他坐标计算执行任何坐标,无论它是什么类型。
显然,可能存在这种解决方案不起作用的情况,但总的来说,我认为它应该有效。