Добавление методов в класс, унаследованных от абстрактного базового класса? - PullRequest
0 голосов
/ 14 января 2019

У меня есть код, подобный следующему

class GameObject
{
public:
    virtual void update(...) = 0;
    virtual void render(...) = 0;
};

class Sprite : public GameObject
{
public:

    Sprite();
   ~Sprite()
    {

    }

    void setSrcRect()noexcept
    {
       //Some code
    }

    void setDstRect()noexcept
    {
       //Some code
    }

    uint32_t getWidth() const noexcept { return width_; }
    uint32_t getHeight() const noexcept { return height_; }

    virtual void update(...) override
    {
        //Some code
    }

    virtual void render(...) override
    {
       //Some code
    }
};

Позже я создаю объект типа

GameObject* obj = new Sprite();

проблема в том, что я не могу вызывать методы типа

obj->getWidth();

Я могу добавить эти методы в GameObject, но я хочу сохранить чистый интерфейс. Только имея чисто виртуальные методы. Я сохраняю GameObject таким образом, потому что это даст мне преимущество, когда позже в игре у меня будет больше объектов.

Я могу просто сохранить их

std::vector<GameObject*> actors;

в рендере я могу сделать

 for(const auto actor: actors)
 {
   actor->render();
 }

Также, поскольку в настоящее время спрайт может быть еще один GameObject SpriteSheet и так далее. Что я могу сделать, чтобы достичь этого? Сохраняйте GameObject как есть, но добавляйте методы к классам, унаследованным от него.

Я понимаю, что тип спрайта все еще GameObject, и вызовы методов могут быть разрешены только во время выполнения. Поэтому я запрашиваю альтернативные методы для достижения этой цели?

1 Ответ

0 голосов
/ 14 января 2019

Использование dynamic_cast :

auto sprite_game_obj = dynamic_cast<Sprite*>(obj);
if(sprite_game_obj) sprite_game_obj->getWidth()

или короче

dynamic_cast<Sprite*>(obj)->getWidth()

Вот пример кода, чтобы показать его в использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...