C++ C++;:具有硬编码派生类的ADT基类与基于文件输入构建的全包类

C++ C++;:具有硬编码派生类的ADT基类与基于文件输入构建的全包类,c++,class-design,C++,Class Design,哪一种设计更好: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) { }

哪一种设计更好: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 */
--或--

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

struct Spell
{
   std::string Type;
   int MinDamage;
   int MaxDamage;
};
要点很简单:你已经概括了所有的咒语。原则上,它们的区别只是名称不同。参数(最小值/最大值)很容易存储为字段。所有这些都不需要高级多态性

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

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

更重要的是,如果您要通过网络传递这些“类”的实例,或者尝试将它们封送到Lua/Python/.NET/NASE中,则可以考虑用char类型(FixEdEdSige)或甚至int类型(具有一些枚举)来改变STD::String。

< P>(保持简单)原则将建议您只使用

struct Spell
{
   std::string Type;
   int MinDamage;
   int MaxDamage;
};
要点很简单:你已经概括了所有的咒语。原则上,它们的区别只是名称不同。参数(最小值/最大值)很容易存储为字段。所有这些都不需要高级多态性

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

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


更重要的是,如果你要通过网络传递这个“类”的实例,或者尝试将它们封送到Lua/Python/.NET/NASE中,你会考虑用char类型[FixEdEdsig大小]来改变STD::String或者甚至是int类型(带有一些枚举)。但如果您需要更多功能,请扩展它

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

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

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