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

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

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

拥有

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

class Person{
public:
    string name;
};

以...实现

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

template<class T>                  
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;               
};

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

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

总结

  • 在应用领域中,复合意味着 has-a(有一个)。在实现领域中意味着 is-implemented-in-terms-of(是根据……实现的)。
posted @ 2020-02-26 17:45  刘-皇叔  阅读(109)  评论(0编辑  收藏  举报