0

我已经看到可以使用继承,例如:

class A {
};

class Legacy{
};

class B : public A, private Legacy {
};

但是从两个不同的类继承公共和私有对我来说很奇怪。是否有实现适配器模式的替代方法?

4

2 回答 2

3

通常最好对适配器使用组合而不是继承(以及许多其他情况):

class B : public A {
  public:
    /* implementation of abstract methods of A with calls to Legacy */

  private:
    Legacy m_leg;
};
于 2017-07-27T21:55:00.410 回答
0

在这里,您正在使用类适配器。使用 Adapter 本身就是一种折衷方案(当我们无法控制 Legacy Adaptee 但仍想使用它时,我们会使用 Adapter)。出于特定目的(匹配所需和提供的接口),我们强制适配器从 Adaptee 以及 Target 继承。因此,适配器类(遭受多重继承)不是跨应用程序的可重用域类,它只是一个(AKA)包装类。它与 Adaptee 以及 Target 的“IsA”关系是强有力的,而不是自然地来自域模型。

即便如此,正如@dlasalle 所指出的,通过组合使用对象适配器将使其使用更加安全。但选择取决于两种类型之间的权衡。例如,如果适配器的 80% 功能是由适配器按原样发布的,那么类适配器是避免为所有这些 80% 编写包装器方法的好选择。C++ 实现可以选择使用 Java 所没有的类适配器(需谨慎)。

于 2017-07-30T01:06:51.693 回答