【发布时间】:2012-11-12 12:22:59
【问题描述】:
我有以下设计问题:
我有一个带有两种访问器的Resource:
- 一个是修改它(我们称之为
Access) - 一个用于类似 const 的访问(我们称之为
Const_access),但您可以说 c1=c2 然后 c1 将访问 c2。
鉴于Resource很大,我必须实现以下复制机制:
Access->Access: deep copy
Access->Const_access: deep copy
Const_access->Access: deep copy
Const_access->Const_access: shallow copy
我的目标是编写Access 以便Const_access 能够完全使用const 中的Access 函数。
我目前的实现有缺陷,使用:
class Access {
public:
Access(const Access&); // deep copy
void method(const Access&);
void const_method() const;
protected:
Resource res;
};
class Const_access : public Access{
private:
void method(); // only declaration
public:
Const_access(const Const_accesss&); // shallow copy
explicit Const_access(const Access&); // deep copy
};
但这里Const_access ca; ca.Access::method() 仍然有效,我必须手动隐藏非常量访问器。我尝试过受保护或私有继承,但这也限制了Access& 处理Const_Access& 的灵活性。
这个问题的正确解决方案是什么?
【问题讨论】:
-
由于
Const_Access的合约比Access的合约窄,因此上述继承没有意义。Const_Access不能用来代替Access,因此这将违反 Liskov 替换原则。 -
我不认为这是重复的问题,因为违反了 Liskov 替换原则。
标签: c++ polymorphism deep-copy shallow-copy