У меня есть класс Enemy
, который я хочу быть базовым классом для всех типов врагов, а также чистым абстрактным. На этом этапе все его члены и методы должны делиться производными классами. В частности, существует метод loadTexture
, который использует статический элемент texture
.Наследование со статическими методами/полями C++
class Enemy
{
int hp;
int damage;
//
// all other fields
//
static TextureClass* texture; //needs to be static because every instance
//of enemy uses the same texture
public:
static void loadTexture()
{
CreateTextureFromFile("somefilepath",&texture); //needs to be static
// because textures are loaded before any instance is crated
}
void draw()
{
DrawToScreen(&texture, ...many data members passed here...);
}
};
TextureClass* Enemy::texture = nullptr;
Теперь, если я хотел бы сделать Enemy
абстрактные и создавать различные типы врагов, очевидный выбор будет наследование. Поэтому я создаю:
class EnemyA : Enemy
{
static TextureClass* texture;
};
class EnemyB : Enemy
{
static TextureClass* texture;
};
Но теперь, как загрузить текстуру для каждого из них? Я не могу использовать loadTexture
, определенный в базе, очевидно. Таким образом, единственный выбор, помимо написания одного и того же метода X раз (где X - количество типов врагов), заключается в удалении loadTexture
из базы и создании глобальной функции, не так ли? То же самое касается draw
, я должен был бы пересмотреть его каждый полученный, несмотря на то, что это будет выглядеть точно так же ...
TL; Д.Р. loadTexture
и draw
имеют точно такое же тело, независимо от типа противника, но они используют статическое поле, которое отличается в каждом из них. Есть ли способ определить что-то вроде единого метода, что при вызове в производном классе будет использовать поле из производного, а не базы?
Благодарим за любые ответы.
Создайте виртуальный метод 'TextureClass * getTexture()', который все подклассы реализуют для извлечения указателя текстуры, а общие методы используют для получения указателя текстуры. – mah
Вы можете сделать это с помощью [CRTP] (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern), если это необходимо, чтобы метод был статическим. В противном случае предпочтительным будет нестатический виртуальный метод. – WhozCraig
@mah 'common method' означает «глобальная функция»? –