2012-05-22 69 views
0

假設我有一個類實體。
然後,我有課N多是從實體
如衍生:繼承的設計類

class Snake : public Entity{...}; 
class Mouse : public Entity{...}; 

現在我有一個類播放器,是一個實體。
我可以創建從任何類型的實體繼承的類播放器嗎? 例如:

class Player : public Entity -->(but instead of entity be any type of entity) 

可以這樣做嗎?
這是通過使用模板來實現的嗎?
我讀過的模板,可以在CPP文件中明確指定,即

template class Entity<Snake>; 

我想達到以下

在我的播放器類我有中移動一個moveCamera功能現在只有當玩家移動,相機移動。如果AI蛇移動,相機不應該移動。

這是我在實體類渲染功能是虛擬

void Entity::Render(float interpolation) 
{ 
    if(currentAnimation != 0){ 
    float x = this->currLocation.x - (this->currentVelocity.x * (1.0f - interpolation)) - camera->getLocation(L_FACTOR_CURRENT).x; 
    float y = this->currLocation.y - (this->currentVelocity.y * (1.0f - interpolation)) - camera->getLocation(L_FACTOR_CURRENT).y; 
    currentAnimation->Render(x,y); 
    } 
} 

這是我gameUpdate功能和基本移動的實體,其各自的世界座標

void Entity::GameUpdate(float gameUpdateDelta) 
{ 
    this->Move(); 
} 

因此,對於我的玩家的移動功能我會調用相機的移動功能,然後調用基類的移動功能......現在可以調用基類的移動功能的擴展類了..
我的移動功能on是虛擬的,因此蛇和鼠標可以以不同的方式移動。

+2

你爲什麼要這樣做?似乎你需要組合,而不是繼承?看看[裝飾模式](http://en.wikipedia.org/wiki/Decorator_pattern) - 可能會幫助 –

+0

我將如何使用裝飾器模式來做同樣的事情? –

+0

可以使用模板,但在這種情況下,您要查找的是一個概念,它不是C++的一部分。相反,實體會成爲您在模板中調用的特定成員函數集合 - 它不會被編碼到語言中。但組合*在大多數情況下是更好的解決方案。 –

回答

1

您可能想要編寫一個從Template參數繼承的模板類Player

template< typename Derived > 
class Player: 
    public Derived, // we believe that Derived inherits Entity 
    public IPlayer // makes sense if Player is not a Entity only interface 
{ 
    ... some declaration here ... 

    void update(); // some virtual method from Entity interaface 
    void player_action(); // some virtual method from IPlayer interaface 

} 

當創建一個具體類型的玩家時,你可以把它放在你的場景中。

IPlayer* player1 = new Player<Snake>("Player1"); 

Entity* playerEntity = dynamic_cast< Entity* >(player1); 
if(playerEntity) // test if object can be placed on scene 
{ 
    scene->add(playerEntity); 
} 

您可能還需要知道如何編寫類方法的部分模板特化。 你也可以找到boost enable_if作爲一個強大的玩具。

+0

您能詳細說明IPlayer中所有功能嗎?接口的函數名稱的一些例子.. –

+0

任何你需要操縱播放器,但不需要實體。像'getCurretScore()'或一些輸入處理。 – Arpegius

+0

好的..我的管狀光頭只是點擊了...謝謝你的回答.. –

0

如果您可以發佈當前設計的界面(僅限於類定義),那麼人們可以提供更多幫助。看起來你需要讓玩家擁有蛇和鼠標。如果您希望某些操作與其他操作相關聯,請使用觀察者。