包装设计模式

时间:2011-08-05 14:15:36

标签: c++ design-patterns

说我有课:

class B;
class A{
public:
    A();
    virtual B foo();
}

在第三方组件中定义。我想包装A和B类,产生myA和myB。 现在,我不能从外部访问A类和B类,而是具有myA和myB相同的功能。可以从第三方模块调用foo()。

我更喜欢使用继承而不是封装。

所以有两个问题:

  1. 如果a类型为myA,则调用a-> myFoo()(由于相同的签名和不同的返回类型,需要重命名方法)应调用A :: foo()。
  2. 如果a类型为myA2 :: myA,则调用a-> myFoo()应调用myA2 :: myFoo()。
  3. 有关如何优雅地做到这一点的任何建议?我提出了一些解决方案,但我更喜欢对整个事情有一个全新的看法。

    编辑:

    只是一个理论问题。我实际上并不需要这样做,只想到可以实现的方法。

    EDIT2:

    myA2是一个扩展myA的类。在模式之前,它将被称为A2(一个从第三方模块扩展A类的类)。

2 个答案:

答案 0 :(得分:2)

我不明白你为什么喜欢用继承而不是封装来做这件事。一般来说,扩展您正在包装的类是实现包装器模式的“错误”方式,尤其是因为您通常希望在该过程中重新定义接口。在类myA中,您将拥有一个包含A类实例的A类字段,myA中的哪些方法可以根据需要调用。除非我误解了你想要完成的任务,否则这是实现你想要的最优雅的方式。

答案 1 :(得分:0)

您应该能够类似地声明函数名称/参数。查看: strange-inheritance部分:[23.9]是什么意思,警告:Derived::f(char)隐藏Base::f(double)?在第3个代码块上。

它还显示了调用基本方法的语法。