综合测验
在本章中,我们了解了两个对象之间的一些不同类型的关系。
Summary
从较简单的对象构建复杂对象的过程称为对象组合。对象组合有两种类型:组合和聚合。
当类的成员与类具有部分关系时,就存在组合。在组合关系中,类管理成员的存在。要符合写作要求,对象和部件必须具有以下关系:
部件(成员)是对象(类)的一部分
部件(成员)一次只能属于一个对象(类)
部分(成员)的存在由对象(类)管理
部分(成员)不知道对象(类)的存在
组合通常通过普通成员变量实现,或者通过指针管理所有内存分配和释放来实现。如果可以将类实现为组合,则应将类实现为组合。
当类与成员具有has-a关系时,存在聚合。在聚合关系中,类不管理成员的存在。要符合聚合条件,对象及其部件必须具有以下关系:
部件(成员)是对象(类)的一部分
部件(成员)一次可以属于多个对象(类)
部分(部件)并没有,它的存在由所述对象(类)管理的
部分(成员)不知道对象(类)的存在
聚合通常通过指针或引用来实现。
关联是一种更松散的关系类型,其中类use - a不相关的对象。要符合关联条件,对象和关联对象必须具有以下关系:
关联对象(成员)与对象(类)无关
关联对象(成员)一次可以属于多个对象(类)
关联的对象(部件)不知道它的存在由对象管理的(类)的
关联对象(成员)可能知道也可能不知道对象(类)的存在
关联可以通过指针或引用实现,或者通过更间接的方式实现(例如保存关联对象的索引或键)。
在依赖中,一个类使用另一个类来执行任务。依赖类通常不是使用它的类的成员,而是临时创建,使用,然后销毁,或从外部源传递到成员函数。
在容器类中,一个类提供一个容器来容纳另一种类型的多个对象。值容器是存储它保持所述对象的副本的组合物。参考容器是存储指针或引用所述容器外的对象的集合。
std :: initializer_list可用于实现构造函数,赋值运算符和其他接受列表初始化参数的函数。std :: initailizer_list位于<initializer_list>标头中。
对象关系 | 组成 | 聚合 | 关联 | 依赖 |
---|---|---|---|---|
关系类型 | 整体/部分 | 整体/部分 | 无关 | 无关 |
成员可以属于多个类 | 没有 | 是 | 是 | 是 |
成员存在由类管理 | 是 | 没有 | 没有 | 是 |
方向性 | 单向 | 单向 | 单向或双向 | 单向 |
关系动词 | 部分 | 有 | 使用 | 依赖于 |
Quiz Time
本章非常简单,比以前的章节更抽象,因此这个测验将简短而重要。
1)以下描述了什么类型的关系(组合,聚合,关联或依赖)?
1a)包含动物类型(枚举)和名称(字符串)的Animal类。
解决方案
组成 - 动物类型和名称在动物之外没有用途。
1b)带有save()函数的文本编辑器类,它接受File对象。save()函数将编辑器的内容写入磁盘。
解决方案
依赖关系 - 文本编辑器类使用File对象执行保存到磁盘的任务。
1c)冒险家类,可以携带各种物品,如剑,魔杖,药水或法术书。这些物品可以被其他冒险者丢弃和拾取。
解决方案
聚合 - 当项目与冒险者相关联时,冒险者拥有它们。当时任何人都不能使用冒险者使用的剑。但冒险家并没有管理物品的存在。
1d)程序员使用计算机在互联网上观看猫视频。
解决方案
关联 - 程序员和计算机是不相关的,除非程序员使用计算机观看小猫在Roombas上骑行。
1e)包含CPU类的Computer类。可以从计算机中删除CPU并自行测试。
解决方案
聚合 - 计算机有一个CPU,但不管理它的存在。
2)选择一个:如果你可以使用(组合,聚合,关联或依赖)设计一个类,那么你应该。
解决方案
组成