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

不要被这个诡异的条款名字欺骗了,他说的是一件简单的事情。

比如,定义一个“人”类,而人又有地址,那么你应该这么写:

class Address
{
public:
	string country;
	string province;
	string city;
};

class Person
{
	string name;
	Address address;
};

而不是用Person去public继承Address,虽然这样做也能让一个人有地址,但是它却违背了public表示is-a的关系。人又不是一个特化了的“地址”。所以,这里使用复合会更恰当一些。复合往往表示2种意思,这取决于你程序的应用:第一种是has-a:当你程序描述的是实际的东西时,大都是这种关系:人有名字,学校有教室等等;第二种是“由XX实现”,比如,集(set)由链表(list)实现等等。
下面就用这个例子来说明:

template<typename T>
class Set
{
public:
	bool member(const T& item)const
	{
		return find(rep.begin(),rep.end(),item) != rep.end();
	}
	void insert(const T& item)
	{
		if(!member(item))
			rep.push_back(item);
	}
	void remove(const T& item)
	{
		typename list<T>::iterator it = find(rep.begin(),rep.end(),item);
		if(it != rep.end())
			rep.erase(it);
	}
	size_t size()const
	{
		return rep.size();
	}
	void print()
	{
		list<T>::iterator it = rep.begin();
		for(;it != rep.end();++it)
			cout<<*it<<"\t"<<endl;
	}
private:
	list<T> rep;
};
让然,与标准库的set相比,这个例子还是有些瑕疵,因为标准库每次插入元素后,都会自动排序。而这里却不行。
总之,复合与public继承完全不同,它意味着has-a或者通过XX实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值