我有一种情况,我有一个类层次结构:Widget
并且Doobry
是继承自的对象类型Base
(实际上有超过 2 种类型)。对象的每个实例都有一个属性列表。有一些属性是所有对象共有的,还有一些属性是特定于每个项目类型的。一个简单的实现可能如下所示:
enum PropertyType {
COMMON_SIZE=0, // first section: properties common to all
COMMON_POSITION,
...
WIDGET_PROPERTY_START=100, // ensure enough space for expansion
WIDGET_DONGLE_SIZE,
WIDGET_TEXT,
...
DOOBRY_PROPERTY_START=200
DOOBRY_COLOUR
....
};
class Base {
public:
Base();
std::vector<std::pair<PropertyType, string>> properties;
};
这实现了一个目标,在调试器中我可以看到映射到有意义名称的属性列表。但是它也有一些缺点:
- 所有项目的属性都在一个标题中定义(不利于封装)
- 如果我们向其中一个类添加更多属性,我们必须为每个类的起始位置选择一些任意数字,以便为将来的扩展留出足够的空间。
我的问题是是否有另一种方法可以实现这一目标。一种想法是我可以使用存储更大、查找速度更慢的字符串常量,但其优点是更容易使名称唯一,并且每种项目类型都可以定义自己的属性。
编辑:要求属性将被序列化,因此必须随着时间的推移保持稳定(即枚举不会改变)。可能有多达 1M 的对象,但绝大多数将有空的属性表(因为它们使用默认值)。查找性能比插入更重要,并且进行字符串散列的性能影响可能可以忽略不计(我们无法衡量它是否还没有写出来!)。