《Effective C++》学习笔记(条款38:通过组合构造出has-a 或 “根据某物实现出”)

最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!!

组合(composition)是类型之间的一种关系,当某种类型的对象内含其它类型的对象,便是这种关系。如:

class Address { ... };
class PhoneNumber { ... };
class Person {	//Person对象由string、Address、PhoneNumber构成
public:
    ...
private:
    std::string name;			//组合对象
    Address address;			//组合对象
    PhoneNumber voiceNumber;	//组合对象
    PhoneNumber faxNumber;		//组合对象
};

在程序员之间组合(composition)这个术语有许多同义词,如 layering(分层),containment(内含)、aggregation(聚合)和embedding(内嵌)。

组合有两个意义:has-a(有一个)is-implemented-in-terms-of(根据某物实现出)(个人理解是基于某个类的功能实现出具有新功能的类,如后面的例子,根据 list 实现出 set)。

当组合发生于 应用域 内的对象时,表现出 has-a 的关系;当它发生于 实现域 内则是表现 is-implemented-in-terms-of 的关系。

  • 应用域中的对象:人、汽车、一张张视频画面等等
  • 实现域中的对象:缓冲区、互斥器、查找树等

上述代码中的例子表现出 has-a 关系。

比较麻烦的是区分 is-a (是一种)is-implemented-in-terms-of(根据某物实现出) 这两种对象关系。

假设我们要创建一个 Set template,希望制造出一组 class 用来表现不重复对象组成的 sets。而标准程序库有提供现成的 set template,但它在效率上不符合需求,所以决定用 list template,但是 list 可以包含重复的元素,又不符合需求,所以需要去改进它。
public 继承(它表现出 is-a 关系)?
—— No! 这两个类之间并不是 is-a 关系,所以需要用到 组合:

template<class T>
class Set  {					//将 list 应用于 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;			//用来表示 set 数据
};
// Set 中的成员函数可依靠 list 及标准程序库其它部分提供的机能来实现,如下:
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))  		// list中没有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
{
    return rep.size();
}

这里的关系就不是 has-a,更不是 is-a,而是 is-implemented-in-terms-of。

Note:

  • 组合 的意义与 public继承 完全不同
  • 在应用域,组合意味着 has-a 关系;在 实现域, 组合意味着 is-implemented-in-terms-of 关系

条款39:谨慎使用 private继承

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值