Извините, я не могу придумать хорошего названия для этого вопроса ...
При запуске приложения загружаю объекты из базы данных через библиотеку доступа к БД, давайте вызывать их класс CDbObject
.
class CDbObject
{
//...
virtual CState getState() const { return m_state; }
protected:
CState m_state;
}
Во время выполнения я получаю сообщения, которые соответствуют изменениям состояния в этих объектах базы данных.
Я хочу минимизировать доступ к БД и, следовательно, не перезагружать весь объект, когда его состояние изменилось.
Вместо этого я хочу обернуть объекты БД и сделать их модифицируемыми.
Я не могу просто получить класс, реализовать метод setState()
и создать объекты этого класса, потому что я должен использовать объекты, которые мне предоставляет библиотека доступа к БД. В объектах не реализован механизм копирования, и я не хочу касаться этого кода, если это возможно.
Я мог бы создать класс-оболочку, который хранит указатель на экземпляр 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;
}
Но очевидным недостатком является то, что мне придется дублировать весь интерфейс обернутого класса.
Чтобы избежать дублирования интерфейса, я мог бы предоставить доступ к обернутому объекту, но это делает обертку практически бесполезной, потому что пользователь сможет получить неправильное состояние, если он не будет достаточно осторожен.
Есть ли элегантный способ выполнить то, что я хочу?
Edit:
Короче говоря: я хочу сделать его прозрачным для пользователя, где хранится статус объекта. Пользователь должен получить текущий статус, вызвав один метод. Надеюсь, это прояснит ситуацию.