Effective C++:条款38:通过复合塑模出has-a或“根据某物实现出”
2014-07-04 18:46
274 查看
(一)
public继承是“is-a“的关系,而复合有”has-a“或”根据某物实现出(is-implemented-in-terms-of)“的意思——当复合发生在应用域内的对象之间,表现出has-a关系;当它发生于实现域内则是表示“根据某物实现出”的关系。
应用域部分,相当于你塑造的世界中的某些事物,例如人,汽车等。
后者的对象则是实现细节人工产品(这产品现实世界中是没有的),像什么mutex,list,container等等。这些对象是你的软件的实现领域。
复合:
(二)
实例:set的构造。标准程序库中有set模板,它“每个元素都耗用三个指针”,是用平衡查找树实现而成,使它们在查找、插入、删除元素时保证拥有log(n)的效率。
可能会想到像这样实现:
让set继承stl::list:
所以这两个classes之间并非is-a关系。不应该是public继承,正确的做法是,set对象可根据一个list对象实现出来:
请记住:
(1)复合的意义和public继承完全不同。
(2)在应用域,复合意味着has-a(有一个)。在实现域,复合意味着is-implemented-in-terms-of(根据某物实现出)。
public继承是“is-a“的关系,而复合有”has-a“或”根据某物实现出(is-implemented-in-terms-of)“的意思——当复合发生在应用域内的对象之间,表现出has-a关系;当它发生于实现域内则是表示“根据某物实现出”的关系。
应用域部分,相当于你塑造的世界中的某些事物,例如人,汽车等。
后者的对象则是实现细节人工产品(这产品现实世界中是没有的),像什么mutex,list,container等等。这些对象是你的软件的实现领域。
复合:
class Address{...}; class PhoneNumber{...}; class Person{ ... private: std::string name_; Address address_; PhoneNumber voiceNumber_; PhoneNumber faxNumber_; };
(二)
实例:set的构造。标准程序库中有set模板,它“每个元素都耗用三个指针”,是用平衡查找树实现而成,使它们在查找、插入、删除元素时保证拥有log(n)的效率。
可能会想到像这样实现:
让set继承stl::list:
template<typename T> class Set : public list<T>{...}; //将list应用于set。错误做法。这种做法是错误的!因为:public继承是is-a关系,父类能做的,子类也一定能做。但set不是一种list,因为对list为真的某些事情对set对象并不为真。例如,list可以内含重复元素,如果30被安插到list<int>两次,那个list将内含两个30,如果30被安插到set<int>两次,set只内含一个30.
所以这两个classes之间并非is-a关系。不应该是public继承,正确的做法是,set对象可根据一个list对象实现出来:
template <typename T> class Set { public: bool member(const T& item) const; void insert(const T& item); void remove(const T& item); size_t size() const; private: list<T> rep; }; template <typename T> bool Set<T>::member(const T& item) const { return find(rep.begin(), rep.end(), item) != rep.end(); } template <typename T> void Set<T>::insert(const T& item) { if(!member(item)) rep.push_back(item); } template <typename T> void Set<T>::remove(const T& item) { typename list<T>::iterator it = find(rep.begin(), rep.end(), item); if(it != rep.end()) rep.erase(it); } template <typename T> size_t Set<T>::size() const { return rep.size(); }
请记住:
(1)复合的意义和public继承完全不同。
(2)在应用域,复合意味着has-a(有一个)。在实现域,复合意味着is-implemented-in-terms-of(根据某物实现出)。
相关文章推荐
- 读书笔记《Effective C++》条款38:通过复合塑模出has-a或“根据某物实现出”
- Effective C++ -----条款38:通过复合塑模出has-a或“根据某物实现出”
- Effective C++ 条款38 通过复合塑模出has-a或"根据某物实现出"
- effective C++ 条款 38:通过复合塑模出has-a或“根据某物实现出”
- 条款38:通过复合塑模出has-a和根据某物实现出
- 条款:38:通过复合塑模出has-a或“根据某物实现出”
- 条款38:通过复合塑模出has-a或“根据某物实现出
- 《Effective C++》读书笔记之item38:通过复合塑模出has-a或“根据某物实现出”
- 条款38:通过复合塑模has-a或“根据某物实现出”
- 条款38:通过复合塑膜出has-a或"根据某物实现"
- 条款38 通过复合塑膜出has-a或"根据某物实现"
- Effective C++:条款38:通过一个复杂的模具has-a要么“基于一些实现”
- 【38】通过复合塑模出Has-A 或根据某物实现出
- 条款38:通过复合塑膜出has-a或"根据某物实现"
- 条款38、根据复合塑模has-a或“根据某物实现出”
- [EffectiveC++]item38:通过复合塑膜出has -a 或“根据某物实现出”
- [翻译] Effective C++, 3rd Edition, Item 38: 通过 composition(复合)模拟 "has-a"(有一个)或 "is-implemented-in-terms-of"(是根据……实现的)
- 条款38 通过复合塑膜出has-a或"依据某物实现"
- 条款38:通过聚合设计has-a或者is-implemented-in-terms-of
- 读书笔记_Effective_C++_条款三十八:通过复合塑模出has-a或者is-implemented-in-terms-of