我有一个拥有任意状态的类,它的定义如下:
class AbstractFoo
{
};
template <class StatePolicy>
class Foo : public StatePolicy, public AbstractFoo
{
};
州政策仅包含代表州的受保护属性 状态可能对于多个行为是相同的,并且可以在运行时替换它们 所有Foo对象都具有相同的接口来抽象状态本身并允许在容器中存储Foo对象 我想找到最简洁,最易于维护的表达方式。
编辑:
以下是关于我的问题的更多信息:
Foo是一个表示某个硬件的状态和行为的类,可以通过物理方式或通过UI(并且有多个UI)进行更改。
我还有四个问题:
1)信号/插槽机制会做什么?
2)是否可以绑定来自Foo中插槽的每个发出信号,以指向Foo,就像它是成员类一样?
3)我应该使用访客而将Foo视为访问类吗?
4)为什么StatePolicy设计不好?
以下是更新的API:
class AbstractFoo
{
public:
virtual void /*or boost::signal*/ notify() = 0; // Updates the UI.
virtual void /*or boost::signal*/ updateState() = 0 // Updates the state
};
答案 0 :(得分:4)
我完全不了解你的情况,但是我的注意事项是:如果你做了AbstractStatePolicy
怎么办?例如:
class AbstractStatePolicy
{
};
class Foo
{
AbstractStatePolicy *state_policy;
public:
Foo(AbstractStatePolicy *state_policy)
: state_policy(state_policy)
{
}
};
这样,您可以使用Foo
动态设置StatePolicy
,而不是使用StatePolicy
将Foo
静态定义为模板。
如果您不喜欢每次创建Foo
时都必须指定state_policy,请考虑使用默认值或编写工厂来实例化{{1}}。
答案 1 :(得分:0)
我认为你所拥有的是一种非常明智的方法。您应该有一个纯虚拟基类来描述您的实现实际可以执行的操作,然后您可以使用您需要的任何状态创建从基类继承的具体类。然后,您可以通过为该基类定义的任何接口与状态进行交互。现在,如果你有可以在运行时改变的任意动态属性,那么实现它的一个好方法是使用地图或字典类型;您可以从字符串(属性名称)映射到字符串(表示属性值),或者如果您想要更多类型安全性,则可以从字符串(属性名称)映射到boost::any的实例。