Я бы передал рендереру модель и попросил нарисовать себя.
class Player
{
public:
void draw(Renderer& renderer);
};
class Enemy
{
public:
void draw(Renderer& renderer);
};
Обратите внимание, что вам не нужно называть функцию drawPlayer
или drawEnemy
, потому что вы уже знаете, что это Player
или Enemy
по типу класса. Это унифицированное соглашение о вызовах идеально подходит для извлечения в общий интерфейс:
class Model
{
public:
virtual void draw(Renderer& renderer) = 0;
virtual ~Model() {}
};
Тогда каждая ваша модель может наследоваться от Model
, а каждая реализация draw
.
Как я уже упоминал в комментарии к ответу @ J.N., вы также можете сделать Renderer абстрактным классом. Например, я работал над проектом, который использовал OpenGL, GDI +, а также нуждался в создании распечаток схем.
class Renderer
{
public:
virtual render(const Triangle& triangle, const Texture& texture) = 0;
virtual ~Renderer() {}
};