如果我有一个代理模式Class A,并且该代理的模式是Class PrxA
问题1

如果我在virtual中定义了几个函数作为A,那么即使在virtual中也应该将这些函数定义为PrxA吗?

现在如果

Class B : public A
{
///code
}

我相信代理类也应该继承。
Class PrxB : public PrxA {
/// code
}

现在假设这些代理类具有以下规则
  • 实例化c'tor中的原始类
  • 将在内部传递所有通过不同内部类传递的引用/指针参数
  • 要获得代理类的实际印象(即从A获取PrxA,我们有一个impl存储,该存储将为我们提供APrxABPrxB

  • 现在有一个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实例。

    10-04 13:51