如果我有代理模式类A
,那么代理就是类PrxA
。
问题1
如果我将virtual
中的A
定义为少量函数,即使在virtual
中也应定义为PrxA
?
现在如果
Class B : public A
{
///code
}
我相信代理类也应该继承。
Class PrxB : public PrxA {
/// code
}
现在假设这些代理类具有以下规则
A
获取PrxA
,我们有一个impl商店,它会从A
和{{PrxA
给我们B
1}}来自PrxB
。现在有一个类C
,它将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。我需要知道一个好的方法。
答案 0 :(得分:0)
如果我将几个函数定义为A中的虚函数,即使在PrxA中也应该定义为虚函数?
只有当您打算从PrxA派生,同时能够将PrxA视为多态基类时。 (从你的帖子的其余部分看,情况确实如此。)
`C :: C(PrxA&amp; A):pa(A),a(getImpl(A)) 如果我通过A它将工作得很好。这里没问题。 当我将B传递给这个C类时,获得B的impl的最佳方法是什么(第二个在C的c'tor中初始化?(注释B来自A)
这就是让事情变得混乱的地方..你不能在这里传递A,除非A派生自PrxA ..你需要在你的措辞中更准确一些,或者使用代码来解释。
如果您通过PrxB(再次,而不是B)并且PrxB派生自PrxA(您已经显示),那么由于PrxB应该实现与PrxA相同的接口(应用Liskov替换原则),您应该能够获得A&amp; ;从PrxB完全一样。这包括您需要获得A&amp; A的案例。假设B派生自A。
如果我需要将PrxB传递给像C这样以PrxA为参考的类,我应该采取什么方法?
正如你已经证明PrxB来自PrxA那么这应该可以正常工作,因为你正在服用PrxA&amp;这可以是对PrxB实例的引用没问题。