如果我有一个代理模式Class A
,并且该代理的模式是Class PrxA
。
问题1
如果我在virtual
中定义了几个函数作为A
,那么即使在virtual
中也应该将这些函数定义为PrxA
吗?
现在如果
Class B : public A
{
///code
}
我相信代理类也应该继承。
Class PrxB : public PrxA {
/// code
}
现在假设这些代理类具有以下规则
A
获取PrxA
,我们有一个impl存储,该存储将为我们提供A
的PrxA
和B
的PrxB
。现在有一个
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
传递给以PrxA作为引用的C
之类的类,我应该在这里采用哪种方法?有没有什么比铸造的方法。同样有趣的是,如果我们限制为一个构造函数,则可以获取PrxA或PrxB的引用,需要对其进行相应的处理才能在初始化程序中获取impl。我需要知道一个好的方法。
最佳答案
仅当您打算从PrxA派生而又能够将PrxA视为多态基类时。 (从您的帖子的其余部分来看,确实是这种情况。)
这就是令人困惑的地方。.除非A从PrxA派生,否则您不能在此处传递A。您需要在措辞上更加精确,或使用代码进行解释。
如果您传递的是PrxB(再次不是B),而PrxB是从PrxA派生的(您已显示),则由于PrxB应该实现与PrxA相同的接口(interface)(应用Liskov替换原理),因此您应该能够从PrxB准确获得A&相同。这包括您需要获取A&到B实例的情况,假设B是从A派生的。
如您所展示的,PrxB是从PrxA派生的,那么这应该已经可以正常工作了,因为您正在使用PrxA&,这可以毫无问题地引用到PrxB实例。