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

复合(composition)是类型之间的一种关系,考虑如下代码:

class Address { }; // 住址
class PhoneNumber {};

class Person {
private:
	std::string name;
	Address address;
	PhoneNumber voiceNumber;
	PhoneNumber faxNumber;
};

Person对象是由string,Address,PhoneNumber构成;上述Person class示范has-a关系,Person有一个名称,一个地址,以及语音和传真两笔电话号码;

比较麻烦的是区分is-a(是一种)和is-implemented-in-terms-of(根据某物实现出)的关系,假如你需要一个template,希望制造出一组classes用来表现由不重复对象组成的sets,你的实现如下:

template<typename T>		//将list用于Set是错误做法
class Set : public std::list<T> {};

如条框32所说:如果D是一种B,对B为真的每一件事情对D也都应该为真,但是list可以内含重复元素,如果数值3051被安插到list<int>两次,那个list将内含两笔3051;Set不可以内含重复元素,如果数值3051被安插到Set<int>两次,这个set只内含一笔3051;因此"Set是一种list"并不为真,因为对list对象为真的某些事情对Set对象并不为真;

由于这个两个classes(Setlist)之间并非is-a关系,所以public继承不适合用来塑模它们;正确的做法是了解,Set对象可根据一个list对象实现出来

template<class T>		// 将list应用与Set,正确做法
class Set {
public:
	bool member(const T &item) const;
	bool insert(const T &item);
	void remove(const T &item);
	std::size_t size() cosnt;
private:
	std::list<T> rep; 	//用来表述Set的数据
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值