C++:具有硬编码派生类的 ADT 基类与从文件输入构建的包罗万象的类

C++: ADT Base class with hard-coded Derived classes vs all-encompassing class built from file-input

本文关键字:文件 输入 包罗万象 构建 基类 C++ 编码 派生 ADT      更新时间:2023-10-16

哪个是更好的设计:具有硬编码、具体派生类和实例的 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
KISS(

保持简单)原则建议你只使用。

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

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

这些"法术"的加载/保存代码不会比基于类的解决方案更困难。

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

更重要的是,如果你打算通过网络传递这个"类"的实例,或者尝试将它们封送到Lua/Python/.NET/其他什么,你会考虑通过char Type[FIXED_SIZE]甚至int Type(带有一些枚举)来更改std::string。

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

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);