想象以下情况:
我想创造各种怪物工厂。这些怪物工厂根据struct
数组提供的数据创建怪物。怪物只是在这些统计数据上有所不同,因此为每个怪物创建一个子类是矫枉过正的。
struct monster_data
{
int HP;
int strength;
int speed;
// even more attributes
};
一个类monster
可以处理基于 a 的怪物的所有行为monster_data
:
class monster
{
public:
monster(monster_data* initial_stats, int length);
void attack();
void walk();
void die();
// and so forth
};
到目前为止,一切都很好。现在我有一个monster_factory
基于硬编码monster_data
数组创建怪物的类:
const monster_data district1_monsters[]
{
{ 500, 20, 4 }, // monster1
{ 550, 5, 12 }, // monster2
{ 420, 8, 10 }, // monster3
{ 310, 30, 7 }, // monster4
// 100 more monsters
};
class monster_factory
{
public:
monster_factory(monster_data* monster_to_create) ;
monster* create_random_monster();
};
我的问题是我必须支持几个monster_factories
地区的几个,列表中的差异很小:
const monster_data district1_monsters[]
{
{ 500, 20, 4 }, // monster1
{ 550, 5, 12 }, // monster2
{ 420, 8, 10 }, // monster3
{ 310, 30, 7 }, // monster4
// 100 more monsters
};
const monster_data district2_monsters[]
{
{ 500, 20, 4 }, // monster1
{ 750, 5, 12 }, // MONSTER2B <<
{ 420, 8, 10 }, // monster3
{ 310, 30, 7 }, // monster4
// monsters 5 - 80 from district 1
};
const monster_data district3_monsters[]
{
{ 500, 20, 4 }, // monster1
{ 550, 5, 12 }, // monster2
{ 720, 80, 10 }, // MONSTER3B <<
{ 310, 30, 7 }, // monster4
// monsters 8 - 90 from district 1
};
我不想复制和粘贴数组数据,而是想以某种方式继承它,因为不同版本之间的数据基本保持不变。复制整个struct
数组声明只是为了有一个稍微不同的变体似乎是错误的方式。太糟糕了,第 2 区和第 3 区只是不附加数据,它们修改并省略了现有条目。当然,它们也改变了不止一个怪物。
此外,1区怪物数据的变化也应适用于2区和3区。
另一个问题是有些地区的怪物数据与地区 1,2 和 3 完全无关。
const monster_data district4_monsters[]
{
{ 100, 20, 10 }, // monster 401
{ 200, 50, 20 }, // monster 402
{ 300, 40, 5 }, // monster 403
{ 400, 30, 30 }, // monster 404
// 20 more monsters unrelated to district 1,2 & 3
};
现在的问题是:如何更改概述的设计,以monster_data
避免多余的声明,并且可以添加monster_data
从现有声明派生或使用全新声明的地区?
奖励积分,如果您的设计确保怪物统计列表的每个变体只能有一个工厂实例。