2

如果我有一个代理模式 ClassA和代理是 Class PrxA。问题1

如果我定义了几个函数,那么virtual那些A应该被定义为virtualeven inPrxA吗?

现在如果

Class B : public A
{
///code
}

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

Class PrxB : public PrxA {
/// code
}

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

  1. 在 c'tor 中实例化原始类
  2. 将在内部传递给通过不同内部类的任何引用/指针参数
  3. 要获取代理类的实际 impl(即APrxA我们有一个 impl 存储,它将为我们提供AfromPrxABfrom PrxB

现在有一个类C将 PrxA 作为其 c'tor 中的引用。

`C::C(PrxA& A): pa(A),a(getImpl(PrxA))

正在初始化的 C 类的本地成员。

PrxA& pa;
A& a;

如果我通过 A,它会很好用。这里没问题。

问题2 当我传递B给这个类C时,获得Bimpl 的最佳方法是什么(第二个在 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
}

如果我需要传递给以 PrxA 作为参考PrxB的类,我应该在这里采取什么方法?C除了铸造还有什么方法吗?

如果我们限制为一个构造函数,这里还有一件有趣的事情,我们可以获得 PrxA 或 PrxB 的引用,需要相应地处理这些引用以在初始化程序中获取 impl。我需要知道一个好的方法。

4

1 回答 1

0

如果我在 A 中将几个函数定义为虚拟函数,那么即使在 PrxA 中也应该将它们定义为虚拟函数?

仅当您打算从 PrxA 派生同时能够将 PrxA 视为多态基类时。(从你的帖子的其余部分来看,情况就是这样。)

`C::C(PrxA& A): pa(A),a(getImpl(A)) 如果我通过 A 它会很好用。这里没问题。当我将 B 传递给此类 C 时,获得 B 的 impl 的最佳方法是什么(第二个在 C 的 c'tor 中初始化?(注意 B 是从 A 派生的)

这就是事情变得混乱的地方..除非 A 从 PrxA 派生,否则您不能在这里传递 A..您需要在措辞上更加精确,或者使用代码来解释。

如果您传递 PrxB(再次,不是 B)并且 PrxB 派生自 PrxA(您已显示),那么由于 PrxB 应该实现与 PrxA 相同的接口(应用 Liskov 替换原则),您应该能够准确地从 PrxB 获得 A&相同。这包括您需要获取 A& 到 B 实例的情况,假设 B 派生自 A。

如果我需要将 PrxB 传递给以 PrxA 作为参考的 C 类,我应该在这里采取什么方法?

正如您所展示的 PrxB 派生自 PrxA 那么这应该已经可以正常工作了,因为您正在使用 PrxA& 它可以作为对 PrxB 实例的引用没问题。

于 2011-08-22T07:50:48.230 回答