C ++中代理模式中的虚函数

时间:2011-08-22 06:41:33

标签: c++ design-patterns proxy-pattern

如果我有代理模式类A,那么代理就是类PrxA。 问题1

如果我将virtual中的A定义为少量函数,即使在virtual中也应定义为PrxA

现在如果

Class B : public A
{
///code
}

我相信代理类也应该继承。

Class PrxB : public PrxA {
/// code
}

现在假设这些代理类具有以下规则

  1. 在c'tor
  2. 中实例化原始班级
  3. 将在内部传递任何通过不同内部类的引用/指针参数
  4. 要获取代理类的实际impl(即从A获取PrxA,我们有一个impl商店,它会从A和{{PrxA给我们B 1}}来自PrxB
  5. 现在有一个类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。我需要知道一个好的方法。

1 个答案:

答案 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实例的引用没问题。