Container
Component
约 519 字大约 2 分钟
2025-09-06
这里用queue(队列)和deque(双端队列)来举例子,class queue内声明了一个class deque,这是一种复合关系,用一个黑色实心菱形来表示。
deque有很多功能,而queue只想取用一部分功能,而隐藏不需要的功能,这可以通过Adapter来实现。
复合(composition)的意义和public 继承完全不同在应用域(application domain),复合意味has-a(有一个)。在实现域(implementation domain),复合意味is-implemented-in-terms-of(根据某物实现出)。
详情见《Effective C++》条款38:通过复合塑模出 has-a或"根据某物实现出"
class Container 复合 class Component,那么构造由内而外,即先构造Component才能构造Container,析构由外而内,即先析构Container才能析构Component。
Container
Component
class String内有一个指针指向class StringRep,但是什么时候拥有这个class StringRep,还不知道,但我可以在任何我想要使用的时候,把任务委托给class StringRep,这就叫Delegation,也可以叫Composition by reference(术语通常把指针也叫reference)。
这种写法也叫编译防火墙,在客户端看来String没有变动,我们只需要修改StringRep,编译StringRep。
public 继承意味is-a。适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个 derived class 对象也都是一个 base class 对象。
提示
尽可能使用复合,必要时才使用private 继承。
详情见《Effective C++》条款32:确定你的 public 继承塑模出 is-a 关系
详情见《Effective C++》条款39:明智而审慎地使用 private 继承