1

哪个设计更好:具有硬编码、具体派生类和实例的 ADT 基类,还是其实例从文件输入构建的包罗万象的类?

例子:

class ADTSpell {
    ADTSpell(std::string name, int min_damage, int max_damage);
    virtual ~ADTSpell()=0;
    //...
};

class Fire : public ADTSpell {
    Fire() : ADTSpell("Fire", 14, 15) { }
    //...
};

/* Other concrete derived classes */

- 或者 -

class Spell {
    Spell(std::string name, int min_damage, int max_damage, /*...*/ )
    //...
};

File: Spells.txt
Fire 14 15
Heal -3 -5
Ice 5 8
4

2 回答 2

3

KISS(保持简单)原则建议您只使用

struct Spell
{
   std::string Type;
   int MinDamage;
   int MaxDamage;
};

要点很简单:你已经概括了所有的咒语。原则上,它们仅在名称上有所不同。参数(最小值/最大值)很容易存储为字段。所有这些都不需要高级多态性。

这些“咒语”的加载/保存代码不会比基于类的解决方案更困难。

如果您需要更多参数(如射弹类型),它可能仍会作为该结构的一个字段包含在内。

更重要的是,如果您要通过网络传递此“类”的实例或尝试将它们编组到 Lua/Python/.NET/whatever,您将考虑通过 char Type[FIXED_SIZE] 甚至更改 std::string到 int 类型(带有一些枚举)。

于 2012-05-31T19:20:30.080 回答
1

我实际上会做类似于第二个的事情,但是如果您需要更多功能,请扩展它。

class MultiTargetSpell : public Spell {
    public MultiTargetSpell(std::string name, int min_damage,
        int max_damage, TargetData targets) :
        Spell(name, min_damage, max_damage) { ... }
    ...
};

...
Spell fire = Spell("Fire", 14, 15);
Spell firestorm = MultiTargetSpell("Firestorm", 25, 30, everyone);
于 2012-05-31T20:01:54.993 回答