条款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意味着一种类型要靠另一种类型才能实现。

 

你可能感兴趣的:(imp)