23-x 第二十三章 概要与测验
在本章中,我们学习了两个对象之间不同类型的关系。
总结
将简单对象组合成复杂对象的过程称为对象组合object composition。对象组合分为两种类型:组合与聚合。
当类成员与该类存在“组成部分part of”关系时,即构成组合Composition。在此关系中,类负责管理成员的存在。要构成组合,对象与组成部分必须满足以下条件:
- 组成部分(成员)属于对象(类)
- 组成部分(成员)每次只能属于一个对象(类)
- 部分(成员)的存在由对象(类)管理
- 部分(成员)未知晓对象(类)的存在
组合通常通过普通成员变量实现,或通过指针实现(此时类负责管理所有内存分配与释放)。若能以组合方式实现类,则应采用组合模式。
聚合Aggregations存在于类与成员之间具有“拥有has-a”关系时。在聚合关系中,类不管理成员的存在。要构成聚合关系,对象及其组成部分必须满足以下条件:
- 组成部分(成员)属于对象(类)
- 部件(成员)可同时属于多个对象(类)
- 部件(成员)的存在不受对象(类)管理
- 部件(成员)未知晓对象(类)的存在
聚合关系通常通过指针或引用实现。
关联Associations是一种较为松散的关系类型,其中类使用一个原本无关的对象。要构成关联association,对象与关联对象必须满足以下条件:
- 关联对象(成员)与对象(类)原本无关联
- 关联对象(成员)可同时属于多个对象(类)
- 关联对象(成员)的存在不受对象(类)管理
- 关联对象(成员)可能知晓也可能不知晓对象(类)的存在
关联关系可通过指针或引用实现,也可采用更间接的方式(如持有关联对象的索引或键值)。
在依赖dependency中,一个类使用另一个类来执行任务。被依赖的类通常不属于使用它的类,而是临时创建、使用后销毁,或从外部源传递到成员函数中。
在容器类container class中,一个类提供容器来容纳另一种类型的多个对象。值容器value container是一种组合结构,存储其持有对象的副本。引用容器reference container是一种聚合结构,存储指向容器外部对象的指针或引用。
std::initializer_list 可用于实现构造函数、赋值运算符及其他接受列表初始化参数的函数。该类型定义于 <initializer_list> 头文件中。
| Property\Type | Composition | Aggregation | Association | Dependency |
|---|---|---|---|---|
| Relationship type | Whole/part | Whole/part | Otherwise unrelated | Otherwise unrelated |
| Members can belong to multiple classes | No | Yes | Yes | Yes |
| Members existence managed by class | Yes | No | No | No |
| Directionality | Unidirectional | Unidirectional | Unidirectional or bidirectional | Unidirectional |
| Relationship verb | Part-of | Has-a | Uses-a | Depends-on |
测验时间
本章内容较为直观,但比前几章更抽象一些,因此本次测验将简明扼要。
1.下列描述属于何种关系类型(组合、聚合、关联或依赖)?
1a) 包含动物类型(枚举enum)和名称(字符串string)的Animal类。
显示答案
组合 -- 动物类型和名称仅在动物范围内有效。
1b) 文本编辑器类,其save()函数接受File对象作为参数,该函数将编辑器内容写入磁盘。
显示答案
依赖——文本编辑器类正在使用文件对象来完成保存到磁盘的任务。
1c) 冒险者类可携带各类物品(剑、魔杖、药水、法术书等),这些物品可被丢弃并被其他冒险者拾取。
显示答案
关联——冒险者与物品并非整体与部分的关系,因此这不属于聚合关系。冒险者使用物品,但不管理物品的存在状态。
1d) 玩家在神龛前祈祷 (以获得新能力)。
显示解决方案
依赖——玩家依赖神龛获取力量,但与之并无长期关联。
1e) 计算机类包含CPU类。CPU可从计算机中分离并独立测试。
显示解决方案
聚合——计算机拥有CPU,但并不管理其存在。
1f) 锻造师拥有专属工作台用于制作工具。
显示解决方案
关联——铁匠使用砧座,但与砧座之间不存在整体-部分关系。
2.选择一项:若能通过(选择一项:组合、聚合、关联或依赖)设计类,则应采用该方式。
显示解决方案
组合

浙公网安备 33010602011771号