C++:具有硬编码派生类的 ADT 基类与从文件输入构建的包罗万象的类
C++: ADT Base class with hard-coded Derived classes vs all-encompassing class built from file-input
哪个是更好的设计:具有硬编码、具体派生类和实例的 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);
相关文章:
- C++文本文件输入
- C++ 中文件输入输出中的长长 v/s int
- 如何修复函数中的 fstream 文件输入以将正确的信息存储在结构数组中?
- 用空格填充 2D 数组(从文件输入)
- 流对象来表示文件输入,然后是标准输入?
- 用精神解析文件输入
- 从文件输入和输出
- 来自文本文件输入 c++ 的向量
- 如何通过键盘或分数文件输入分数
- 了解文件输入和输出,我可以写入文件,但无法从文件打印
- 词频程序 - 文件输入太大?
- 尝试从 csv 文件输入大量数据时出错
- 如何将文件从文件输入到C 中的矩阵中
- 如何从Windows CMD运行可执行文件并将其传递给文件输入的参数参数和重定向
- 如何解析文本文件并使用构造函数中的文件输入来创建对象的容器
- 这是读取文件输入的正确方法吗?
- 如何在 c++ 中使用二进制文件输入/输出读取/写入结构的字符串类型成员
- 如何创建一个具有空值、递减编号系统和.txt文件输入值的二维阵列网格
- C 文件输入流循环问题
- 使用对输入整数的文件输入