我已经看到可以使用继承,例如:
class A {
};
class Legacy{
};
class B : public A, private Legacy {
};
但是从两个不同的类继承公共和私有对我来说很奇怪。是否有实现适配器模式的替代方法?
我已经看到可以使用继承,例如:
class A {
};
class Legacy{
};
class B : public A, private Legacy {
};
但是从两个不同的类继承公共和私有对我来说很奇怪。是否有实现适配器模式的替代方法?
通常最好对适配器使用组合而不是继承(以及许多其他情况):
class B : public A {
public:
/* implementation of abstract methods of A with calls to Legacy */
private:
Legacy m_leg;
};
在这里,您正在使用类适配器。使用 Adapter 本身就是一种折衷方案(当我们无法控制 Legacy Adaptee 但仍想使用它时,我们会使用 Adapter)。出于特定目的(匹配所需和提供的接口),我们强制适配器从 Adaptee 以及 Target 继承。因此,适配器类(遭受多重继承)不是跨应用程序的可重用域类,它只是一个(AKA)包装类。它与 Adaptee 以及 Target 的“IsA”关系是强有力的,而不是自然地来自域模型。
即便如此,正如@dlasalle 所指出的,通过组合使用对象适配器将使其使用更加安全。但选择取决于两种类型之间的权衡。例如,如果适配器的 80% 功能是由适配器按原样发布的,那么类适配器是避免为所有这些 80% 编写包装器方法的好选择。C++ 实现可以选择使用 Java 所没有的类适配器(需谨慎)。