条款38:通过复合塑模出has-a或“根据某物实现出”

/程序中的对象,其实相当于你所塑造的世界中的某些事件,例如人、汽车、一线线画面等等,这样的对像属于应用域部分( Application domain ).
//其它对象则纯粹是实现细节上的人工制品, 像是缓冲区(buffers),互斥器(mutexes),查找树(search trees)等等,这些相当于软件的实现域( Implememtation domain ).
//当复合发生在应用域对象之间,表现出has-a关系
//当复合发生在实现域内则表现is-implemented-in-terms-of的关系


/******************通过list实现set
//通过public 继承实现不正确
//因为“Set是一种list”并不为真
//例如可能会通过list的方法插入一个与以有元素重复的元素
#include <list>
template <typename T>
class Set : public std::list<T>{};


//is-implemented-in-terms-of
#include <list>
#include <algorithm>


template <typename T>
class Set
{
public:
bool member(const T& item) const;
void insert(const T& item);
void remove(const T& item);
std::size_t size() const;
private:
std::list<T> rep;
};


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


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


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


template <typename T>
std::size_t Set<T>::size() const
{
rep.size();
}
***********************************/
请记住:

》复合(composition)的意义与public继承完全不同
》在应用域复合意味着has-a, 而在实现域复合意味着is-implemented-in-terms-of

猜你喜欢

转载自blog.csdn.net/u010731020/article/details/81038807