次の状況を想像してみてください。
いろいろなモンスター工場を作りたいです。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つの問題は、地区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
、既存の宣言から派生するか、まったく新しい宣言を使用する地区を追加できるように、アウトライン化された設計をどのように変更できますか?
ボーナスポイント、モンスター統計リストのすべてのバリアントに対して1つのファクトリインスタンスのみが存在できるように設計されている場合。