抱歉,我想不出这个问题的好标题...
在应用程序启动时,我通过数据库访问库从数据库加载对象,让我们调用它们的类CDbObject
。
class CDbObject
{
//...
virtual CState getState() const { return m_state; }
protected:
CState m_state;
}
在运行时,我收到与这些数据库对象中的状态更改相对应的消息。
我想最小化数据库访问,因此当它的状态改变时不重新加载完整的对象。
相反,我想包装 DB 对象并以某种方式使它们可修改。
我不能简单地派生一个类、实现一个setState()
方法并创建该类的对象,因为我必须使用 DB 访问库给我的对象。这些对象没有实现复制机制,如果可能的话,我根本不想碰那个代码。
我可以创建一个包装类来存储指向 CDbObject 实例的指针,如下所示:
class CWrapper
{
public:
CWrapper(CDbObject* p): m_pDbObject(p)
{
m_state.setValid(false);
}
void setState(CState state)
{
m_state.copy(state);
m_state.setValid(true);
}
CState getState() const
{
return m_state.isValid() ? m_state : m_pDbObject->getState();
}
private:
CDbObject* m_pDbObject;
CState m_state;
}
但明显的缺点是,我必须复制包装类的完整接口。
为了避免重复接口,我可以提供对包装对象的访问,但这使得包装器实际上毫无用处,因为如果用户不够谨慎,他可能会得到错误的状态。
有没有一种优雅的方式来完成我想要的?
编辑:
简而言之:我想让它对存储对象状态的用户透明。用户应通过调用一种方法获得当前状态。我希望这使它更清楚一点。