在 C++ 中实现适配器模式的最佳方法是什么

What is the best way to implement the adaptor pattern in c++

我看到可以使用继承,比如:

class A {
};

class Legacy{
};

class B : public A, private Legacy {
};

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

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

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

  private:
    Legacy m_leg;
};

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

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