我有几个基类/接口类,每个类都有几个派生类。我需要在每个派生类上存储元数据,这些派生类有很多重叠,但值不同。
我还有一个Factory类,用于创建派生类的实例,这些派生类实现为单例并具有一些宏。例如,您:
REGISTER_COMPONENT("MyComponent", MyComponentClass);
// create an instance of each component
BaseComponent *base;
foreach(QString component, ComponentRegister::componentList())
{
base = ComponentRegister::create(component);
// do stuff with base
}
问题是:从稳固的设计角度来存储元数据的方式和位置。
我可以将数据作为QMap结构存储在ComponentRegister中。当有人注册组件时,他们也可以用
之类的东西注册其元数据REGISTER_COMPONENT_METADATA("MyComponent", MyMap);
如果特定键的QVariant :: isValid(),您知道元数据已设置且可用。
另一种方法是静态类变量或静态类QMap。
我看到了两者的优点和缺点。大多数元数据都是“这个类的QResources的路径”,它没有与类本身的业务逻辑紧密耦合。
静态类变量方法的另一个问题是继承。您不能像使用纯虚函数那样强制覆盖静态类变量。因此,如果有人忘记了......可能不清楚继承树中的值来自何处。如果您需要通过一系列纯虚拟“getter”访问元数据,那么MetaData的设置将分布在Base类的所有实现中。
如果您需要进行更改(例如更改资源的根路径),则在Register中保存,设置和查找数据,您可以在单点注册调用中执行此操作...可能是标头或包含在应用程序实用程序功能中。使用静态数据,您必须编辑每个类声明。
欢迎提出建议并致谢!
答案 0 :(得分:0)
如果与对象相关的数据不是特定于单个实例的,作为示例中的路径,我的设计通常包含一个管理我的对象集合的类。这就是我放置元数据的地方。
示例:
class zoo { std::vector<animals> zoo_animals; size_t count; }
count是关于动物的元数据。