条款38:通过聚合设计has-a或者is-implemented-in-terms-of

聚合:类型之间的一种关系,就是一种类型内含有另一种类型的变量。

has-a:

 1 class Address
 2 {
 3     
 4 };
 5 
 6 class PhoneNumber
 7 {
 8     
 9 };
10 
11 class Person
12 {
13 public:
14     
15 private:
16     std::string name;
17     Address address;
18     PhoneNumber cellphone;
19 };

说明:Person中包含姓名、地址、手机号,是一种典型的has-a关系。

is-implemented-in-terms-of(根据一种类型实现另一种类型):

用链表List实现集合Set[具体如何实现请参考《算法精解:C语言描述 第7章》],但是我们知道List可以包含重复的元素,而set不能重复,因此set不是一个List,即通过public继承不能满足要求。当然也可以重新设计一个set,但是由于set中的大部分操作与List一样,本着软件重用的思想,set可以如下定义:

 1 template<typename T>
 2 class Set
 3 {
 4 public:
 5     bool member(const T& item) const;
 6     void insert(const T& item);
 7     void remove(const T& item);
 8     std::size_t size() const;
 9     
10 private:
11     std::list<T> rep;
12 };

总结:

has-a意味着一种类型是另一种类型的补充;is-implemented-in-terms-of意味着一种类型要靠另一种类型才能实现。

原文地址:https://www.cnblogs.com/benxintuzi/p/4525742.html