我想写一个可以扩展的库。这是一个粗略的代码大纲:
class Object
{
ActionProc* pAP;
};
class Sphere : public Object;
class Point : public Object;
class ActionProc
{
virtual Action( Object* ) = 0;
};
class ActionProcMove : public ActionProc
{
bool m_bCanMove;
virtual Action( Object* obj )
{
if( m_bCanMove )
{
//do some moving stuff
}
};
};
此库的用户可能会像这样扩展它: (再次,只是一个代码大纲)
class ActionProcSize : public ActionProc
{
bool m_bCanSize;
virtual Action( Object* obj )
{
if( m_bCanSize)
{
//do some sizing stuff
}
};
};
虽然这样可行,但这意味着我必须为我创建的每个对象对象创建一个make-procedure-object。相反,我更愿意为需要这种类型的过程的所有对象创建一个过程对象。
或者换句话说,我需要一个地方来存储链接到对象的过程所需的额外变量。
请注意,这不是实际代码,只是一个示例
答案 0 :(得分:0)
如果您想避免使用默认行为添加ActionProcs,您可以指向具有此行为的全局(希望无状态)ActionProc。您可以通过在构造函数中传递ActionProc来为非默认行为覆盖继承的类和覆盖。
BTW:您的代码类似于GOF的bridge设计模式。
答案 1 :(得分:0)
您可能需要考虑将状态存储在Object本身中。
class Object {
std::map<UINT32 id, bool variable> mBoolStates;
std::map<UINT32 id, UINT32 variable> mUINTStates;
ActionProc* pAP;
};
然后,用户可以向对象添加想要的状态,并在其Action类实例中检索它们。 (可能有更好的方法来提供状态集合。)