У меня есть код, подобный следующему
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, и вызовы методов могут быть разрешены только во время выполнения. Поэтому я запрашиваю альтернативные методы для достижения этой цели?