2013-01-06 119 views
0

類的參數,我想創建一個接口聲明的接口方法具有實現該接口

Coordinate 

與方法

double distanceTo(Coordinate *otherCoord); 

,但我想實現該接口的類實施各自的distanceTo版本。

例如,如果GeographicCoordinate實現Coordinate那麼就應強制執行法

double distanceTo(GeographicCoordinate *otherCoord); 

而不是

double distanceTo(Coordinate *otherCoord); 

什麼將是C++的語法來表達呢?

回答

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);就足夠了,通過使相關函數變爲虛擬的,消除了模板的需要。

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; 
    }  
} 

這樣,您就可以執行任何協調,任何其他座標計算,不管它是什麼類型。

很明顯,可能會出現這種解決方案不起作用的情況,但總的來說,我認爲它應該起作用。