Представьте, что есть команда для программирования игр, один разработчик фокусируется на данных, поэтому он создает два класса:
class EnemyProperties {
public:
int health;
};
class OrcProperties : public EnemyProperties {
public:
int strength;
};
, а другой программист фокусируется на поведении. В качестве класса Enemy
он создает реализацию:
class EnemyImpl : public EnemyProperties {
public:
void run() {}
};
но когда дело доходит до реализации Orc
, он пишет:
class OrcImpl : public OrcProperties, public EnemyImpl {
public:
void attack() {}
};
и у него возникает ощущение, что если таких прототипов будет больше, наследование алмазов может произойти, поэтому он должен сделать все наследование virtual
.
Хотя виртуальное наследование решило эту проблему, у меня сложилось впечатление, что это проблема шаблона проектирования, отличная от проблемы наследования алмазов,Проще говоря: OrcImpl
должен наследоваться от реализации EnemyProperties
и определять поведение, которое относится к Orc
.
Любые другие шаблоны проектирования или методы, позволяющие сделать это другимчем использовать множественное наследование?
Или любые другие языки или терминологии для решения этой проблемы наследования прототипа данных?
PS Я думаю, что этоЭта проблема немного больше, чем простая композиция типов, она включает прототип, наследуемый от другого прототипа, а реализация наследуется от другой реализации.