聚合:类型之间的一种关系,就是一种类型内含有另一种类型的变量。
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意味着一种类型要靠另一种类型才能实现。