条款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之间产生了一个编译依存关系.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值