【发布时间】:2011-10-31 22:00:51
【问题描述】:
如果我有一个代理模式 Class A 并且代理是 Class PrxA。
问题1
如果我在A 中将几个函数定义为virtual,即使在PrxA 中也应该定义为virtual?
现在如果
Class B : public A
{
///code
}
我相信代理类也应该继承。
Class PrxB : public PrxA {
/// code
}
现在假设这些代理类有以下规则
- 在 c'tor 中实例化原始类
- 将在内部传递给通过不同内部类的任何引用/指针参数
- 要获取代理类的实际 impl(即从
PrxA获取A,我们有一个 impl 存储,它将为我们提供来自PrxA的A和来自PrxB的B。李>
现在有一个 C 类,它在其 c'tor 中将 PrxA 作为引用。
`C::C(PrxA&A): pa(A),a(getImpl(PrxA))
正在初始化的 C 类的本地成员。
PrxA& pa;
A& a;
如果我通过 A,它会很好用。这里没问题。
问题2
当我将B 传递给此类C 时,获得B 的 impl 的最佳方法是什么(第二个在 C 的 c'tor 中初始化?(注意 B 派生自 A)
我可以考虑在getImpl(A) 中进行类似这样的转换,但看起来不是一个好的解决方案。
A* getAImpl(PrxA& pa)
{
if (implA(pa) != NULL)
return A;
else
return dynamic_cast<B>(A); // can't do this. since A will be returned but I actually need B
}
如果我需要将PrxB 传递给像C 这样以PrxA 作为参考的类,我应该采取什么方法?除了铸造还有什么方法吗?
如果我们限制为一个构造函数,这里还有一件有趣的事情,我们可以获得 PrxA 或 PrxB 的引用,需要相应地处理这些引用以在初始化器中获取 impl。我需要知道一个好的方法。
【问题讨论】:
-
你为什么在你的帖子末尾放了15个空行?为什么不使用预览功能?
-
格式问题。我纠正了它。对此感到抱歉。
-
我认为(如果我解释正确的话)您在这里有一个非常有趣的问题,但很难解释。也许你可以重新组织一下?
-
不清楚在问什么
-
如果他说的是从多个类继承某些东西,那么只需添加另一个 : 然后是类名。另外(如果我对您的意思的猜测是正确的)那么只有在“父母”中才需要将它们设为虚拟。
标签: c++ design-patterns proxy-pattern