Item 38:通过组合表示"拥有"或"以...实现"的关系 Effective C++笔记

Posted harttle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Item 38:通过组合表示"拥有"或"以...实现"的关系 Effective C++笔记相关的知识,希望对你有一定的参考价值。

Item 38: Model "has-a" or "is-implemented-in-terms-of" through composition.

一个类型包含另一个类型的对象时,我们这两个类型之间是组合关系。组合是比继承更加灵活的软件复用方法。 Item 32提到public继承的语义是"is-a"的关系。对象组合也同样拥有它的语义:

  • 就对象关系来讲,组合意味着一个对象拥有另一个对象,是"has-a"的关系;
  • 就实现方式来讲,组合意味着一个对象是通过另一个对象来实现的,是"is-implemented-in-terms-of"的关系。

拥有

拥有的关系非常直观,比如一个Person拥有一个name

class Person
public:
    string name;
;

以...实现

假设你实现了一个List链表,接着希望实现一个Set集合。因为你知道代码复用总是好的,于是你希望Set能够继承List的实现。 这时用public继承是不合适的,List是可以有重复的,这一性质不适用于Set,所以它们不是"is-a"的关系。 这时用组合更加合适,SetList来实现的。

template<class T>                   // the right way to use list for Set
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;                 // representation for Set data
;

Set的实现可以很大程度上重用List的实现,比如member方法:

template<typename T>
bool Set<T>::member(const T& item) const 
  return std::find(rep.begin(), rep.end(), item) != rep.end();

复用List的实现使得Set的方法都足够简单,它们很适合声明成inline函数(见Item 30)。


除非注明,本博客文章均为原创,转载请以链接形式标明本文地址: http://harttle.com/2015/09/05/effective-cpp-38.html

以上是关于Item 38:通过组合表示"拥有"或"以...实现"的关系 Effective C++笔记的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 17. 电话号码的字母组合(回溯)

leetcode-----17. 电话号码的字母组合

导出excel数据

JAVA怎么合并两个数组

小程序 上拉加载onReachBottom 的使用(以下是在mpvue中的例子)

Mybatis 常用sql之批量添加和修改