【问题标题】:Virtual functions in Proxy pattern in C++C++中代理模式中的虚函数
【发布时间】:2011-10-31 22:00:51
【问题描述】:

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

如果我在A 中将几个函数定义为virtual,即使在PrxA 中也应该定义为virtual

现在如果

Class B : public A
{
///code
}

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

Class PrxB : public PrxA {
/// code
}

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

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

现在有一个 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 传递给像C 这样以PrxA 作为参考的类,我应该采取什么方法?除了铸造还有什么方法吗?

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

【问题讨论】:

  • 你为什么在你的帖子末尾放了15个空行?为什么不使用预览功能?
  • 格式问题。我纠正了它。对此感到抱歉。
  • 我认为(如果我解释正确的话)您在这里有一个非常有趣的问题,但很难解释。也许你可以重新组织一下?
  • 不清楚在问什么
  • 如果他说的是从多个类继承某些东西,那么只需添加另一个 : 然后是类名。另外(如果我对您的意思的猜测是正确的)那么只有在“父母”中才需要将它们设为虚拟。

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


【解决方案1】:

如果我在 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 替换原则),您应该能够获得 A&从 PrxB 完全一样。这包括您需要获取 A& 到 B 实例的情况,假设 B 派生自 A。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2017-03-29
    相关资源
    最近更新 更多