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.选择一项:若能通过(选择一项:组合、聚合、关联或依赖)设计类,则应采用该方式。

显示解决方案

组合
posted @ 2026-01-31 08:19  游翔  阅读(0)  评论(0)    收藏  举报