想象一下下面的情况:继承struct数据
我想创建各种怪物工厂。这些怪物工厂根据struct
阵列提供的数据创建怪物。怪物只在这些统计数据中有所不同,因此为每个怪物创建一个子类是矫枉过正的。
struct monster_data
{
int HP;
int strength;
int speed;
// even more attributes
};
类monster
可以处理基于一个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
或使用全新声明的区域?
奖励积分,如果您的设计确保怪物统计列表的每个变体只能有一个工厂实例。
看起来很浪费和多余,但最简单的方法就是像现在一样将它保留为几个(可能是重复的)表格。另外,你可能希望将这些表格保持在外部,例如在例如一个或多个文件,并在启动程序时读取它。 – 2012-07-18 08:56:13
@JoachimPileborg我认为这种可能性,但我期待大约10个额外的区域从另一个区域继承他们的表格。如果一个怪物的统计信息发生变化并需要传播到其他文件,采用简单方法并将数据存储在文件中可能会成为维护噩梦。此外,玩家将可以稍后编辑这些文件。 ;-) – 2012-07-18 09:13:53
你的工厂在它的consructor中只需要一个'monster_data',是否意味着需要'monster_data *'(和一个长度?),以便它可以从数组中挑选一个随机怪物? – 2012-07-18 09:25:33