Item 38:通过组合表示"拥有"或"以...实现"的关系
2018-01-23 16:37
369 查看
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”的关系。 这时用组合更加合适,Set以List来实现的。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.land/2015/09/05/effective-cpp-38.html
感谢作者 Harttle
相关文章推荐
- Item 38:通过组合表示"拥有"或"以...实现"的关系 Effective C++笔记
- [翻译] Effective C++, 3rd Edition, Item 38: 通过 composition(复合)模拟 "has-a"(有一个)或 "is-implemented-in-terms-of"(是根据……实现的)
- 通过微软System Center 2012 VMM实现私有云环境裸金属部署的"最高境界" 推荐
- 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
- [EffectiveC++]item38:通过复合塑膜出has -a 或“根据某物实现出”
- 条款38:通过复合塑膜出has-a或"根据某物实现"
- 条款38:通过复合塑膜出has-a或"根据某物实现"
- Effective C++ 条款38 通过复合塑模出has-a或"根据某物实现出"
- 条款38 通过复合塑膜出has-a或"依据某物实现"
- 怎样通过关键字 "AT" 实现变量覆盖
- 读书笔记 effective c++ Item 38 通过组合(composition)为 “has-a”或者“is-implemented-in-terms-of”建模
- 通过分层来体现 "有一个" 或 "用...来实现"
- 《Effective C++》读书笔记之item38:通过复合塑模出has-a或“根据某物实现出”
- Item 32:确保public继承是"is a"的关系
- windows通过"运行"win+r实现快速打开应用程序
- 条款38 通过复合塑膜出has-a或"根据某物实现"
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
- 如何 "使用" 静态方法约束实现类或子类
- UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现
- UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)