条款40:通过layering技术来模塑"有一个"(has-a)或"根据某物实现(is-implemented-in-terms-of)"

1,所谓laying,就是以一个class为本,建立另外一个class.
外层class含有内层class作为其数据成员.
例如:
class Address { ... };           // where someone lives
class PhoneNumber { ... };

class Person
{
public:
  ...
private:
  string name;                   // layered object
  Address address;               // ditto
  PhoneNumber voiceNumber;       // ditto
  PhoneNumber faxNumber;         // ditto
};

对比public继承"是一种",layering意味着"有一个"或"根据某物实现".

2,应用,利用List实现Set.
template<class T>
class Set
{
public:
	bool member(const T& item) const;
	void insert(const T& item);
	void remove(const T& item);
private:
	list<T> rep;
};

template<class T>
bool Set<T>::member(const T& item) const
{
	return find(rep.begin(), rep.end(), item) != rep.end(); 
}

template<class T>
void Set<T>::insert(const T& item) const
{
	if(!member(item))
		rep.push_back(item);
}

template<class T>
void Set<T>::remove(const T& item) const
{
	list<T>::iterator ite = find(rep.begin(), rep.end(), item);
	if (ite != rep.end())
		rep.erase(ite);
}

注:这里List和Set的关系不是"isa",Set不允许元素重复,而是"根据某物实现"的关系.

3,需要注意的是:当你使用laying技术来模塑两个class之间的关系时,你便在那些class之间产生了一个编译依存关系.

你可能感兴趣的:(imp)