2012-05-22 3 views
0

Предположим, у меня есть класс Entity.
И тогда я п число классов, производный от Entity
например:Проектирование классов для наследования

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 Snake перемещается, камера не должна двигаться.

это моя визуализация функция в классе сущностей, который является виртуальным

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

Поэтому для моих функция перемещения игрока Я вызову функцию перемещения камеры, а затем вызову функцию перемещения базового класса ... Теперь можно вызвать расширенный класс функции перемещения класса базы.
My Move functi on является виртуальным, и поэтому змея и мышь могут двигаться по-другому.

+2

Зачем вам это нужно? Похоже, вам нужна композиция, а не наследование? Взгляните на [Decorator pattern] (http://en.wikipedia.org/wiki/Decorator_pattern) - может помочь –

+0

, как бы я сделал то же самое с помощью декоратора? –

+0

Возможно использование шаблонов, но в этом случае то, что вы ищете, - это концепция, которая не является частью C++. Вместо этого Entity становится ad-hoc набором функций-членов, которые вы вызываете внутри шаблона, - он не кодируется на языке. Но состав * является лучшим решением в большинстве случаев. –

ответ

1

Возможно, вы захотите написать класс шаблона Player, который наследует параметр Template.

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

Все, что вам нужно для манипулирования проигрывателем, но не требуется для Entity. Как 'getCurretScore()' или некоторые входы обрабатывают. – Arpegius

+0

Хорошо .. моя голова только что щелкнула ... спасибо за этот ответ .. –

0

Было бы полезно помочь людям, если вы сможете опубликовать интерфейс (просто определение класса) вашего текущего проекта. Похоже, вам нужно сделать у игрока собственную змею и мышь. Используйте наблюдателей, если вы хотите, чтобы какое-либо действие было связано с другими действиями.

Смежные вопросы