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

本文探讨了复合与public继承的区别,强调了二者在应用域与实现域的不同意义。通过具体的代码示例展示了如何使用复合来实现Set类,而非通过public继承list类。文章深入分析了has-a与is-implemented-in-terms-of两种关系。
摘要由CSDN通过智能技术生成
/程序中的对象,其实相当于你所塑造的世界中的某些事件,例如人、汽车、一线线画面等等,这样的对像属于应用域部分( 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值