在讨论C ++实现时" DesignPatterns:可重复使用的面向对象软件的元素" 中的 Adapter
模式,它是这样的:
[...]在类适配器的C ++实现中,
Adapter
将从Target
公开继承,并从Adaptee
私下继承。 [...]
有人可以在这里解释原因吗?
答案 0 :(得分:3)
在面向对象的编程中,对象类之间的关系可以归类为" is-a"," has-a"或者"是按照"实现的。
说到C ++," 是-a "关系可以(而且应该)通过公共继承来实现。
"的 HAS-一个强>"可以(而且应该)通过遏制来实施。它使得using类仅依赖于所使用类的公共部分。在极少数情况下,作为最后的手段,您可能希望实施" has-a"通过非公共继承,但通常它是不良设计的指标。
"的是实现的功能于条件方面的强>"可以通过包含或非公共继承来实现。
非公共继承允许您访问已使用类的受保护部分,覆盖其虚拟方法等。它还可以帮助其他人更好地理解您的意图(只要非公开继承表达"是 - 实施的"和遏制表达" has-a")。
另一方面,遏制有其自身的一些优点。例如,它允许使用已使用类的多个实例。它还允许我们实现依赖注入,从而满足依赖性倒置原则。
适配器"是-A" Target的子类型,同时" 是实现的 - & #34;适配者。 因此,适配器应该从Target公开继承。 但是你可以使用私有继承或包含来实现" is-implemented-in-terms-of" Adapter和Adaptee之间的关系。
用于决定使用哪种关系类型的主要标准之一是要实现的适配器模式类型(类适配器或对象适配器)。