《C++面向对象高效编程(第2版)》——2.27 关联

简介:

本节书摘来自异步社区出版社《C++面向对象高效编程(第2版)》一书中的第2章,第2.27节,作者: 【美】Kayshav Dattatri,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.27 关联

C++面向对象高效编程(第2版)
关联表示对象与不同类之间的结构关系(structual relationship),大多数关联都是二元关系(binary relation)。类之间的多重关联(multiple association)和类本身的自关联(self association)都是合法的(见图2-19)。

关联可以有一个名称,表明阅读方向的箭头为可选。注意,方向箭头为可选,但关联名必须显示。关联在不同的方向可以有不同的名称,但是,大多数情况下,没必要注明(特别是在已标出角色名(role name)的情况下)。

“为其工作”是从Person到Company的关联名,“雇佣”是从Company到Person的关联名,箭头指明关联的方向。如此详细的命名并不常见。
image

图2-19

每个关联的末端就是角色。每个角色都有一个名称,说明其他的类如何看待这个类。Company将Person看做成“雇员”。类似地,Person将Company看成“雇主”。角色名必须唯一,它比关联名更重要。

每个角色都说明了类的多重性(multiplicity)。例如,Person可以为许多公司工作(即人与许多公司相关联)。这说明角色的多重性(有多少个Company类对象可以与一个Person类对象相关联?)。符号表明“许多”(对象的无限数目,其表示为0..)。一个Person可以为许多Company工作,一个Company可以雇佣许多Person。因此,Company对于Person的多重性就是1..*(许多)。多重性也可以是一个数字(1或5等等),或者是一个范围(1..5)。

关联末端的箭头表明关联的导航性。例如,如果可以找到(遍历)Person所拥有的所有DrivingLicense(驾驶执照)类对象列表,可以表示为图2-20。

Person可以拥有许多驾驶执照(不同国家、不同类别等),但是DrivingLicense一定只属于一个Person。

一个类还可以与本身形成关联,即成为关联类(association class)。在下面的示例中(见图2-21),ATMTransaction有自己的属性和操作。关联类也可以与自身形成关联。在关联线用虚线引出的类,即是关联类。

在该例中(见图2-21),ATM类包含诸如owner(谁操作ATM,通常是银行)、address(物理位置)等的细节信息。

当然,Person在Company中所占据的Job本身也是一个类(见图2-22)。

关联类可能只包含关联的属性,而无任何操作。在这种情况下,关联类的名称可以不显示。

image

图2-21

2.27.1 作为聚集的关联

在许多情况下,我们更倾向于显示整体-部分关系。聚集1(aggregation)是一种特殊形式的关联。这种情况下,部分(即整体所包含的部分)的生存期不再取决于整体的生存期(见图2-24)。

通过一个空菱形连接的类为聚集。不能在线的两端都绘制菱形(见图2-23)。当类之间没有生存期依赖时,该表示法用于表示常见的按引用聚集。Orchestra(管弦乐队)是Performer(演奏者)的全体演出者。如果将表示聚集的空菱形填充,则表示组合(composition)——聚集的一种加强的形式。稍候将讨论这个问题。

image

图2-23

2.27.2 OR 关联
在某些情况下,一个类可以参与两个关联,但是每个对象一次只能参与一个关联。BankAccount可以由一人或多人所持有(共同账户(joint account)),或由Company(公司)持有。这种情况可以用约束条件{or}表示。因此,Person的多重性是*,而Company的多重性就是1。Automobile(汽车)也可作为类似的例子,Company或Person都可以拥有Automobile。

相关文章
|
13天前
|
算法 Java 程序员
【C++专栏】C++入门 | 类和对象 | 面向过程与面向对象的初步认识
【C++专栏】C++入门 | 类和对象 | 面向过程与面向对象的初步认识
24 0
|
1天前
|
C++
c++面向对象
c++面向对象
8 0
|
13天前
|
C++
C++从入门到精通:2.1.2函数和类——深入学习面向对象的编程基础
C++从入门到精通:2.1.2函数和类——深入学习面向对象的编程基础
|
13天前
|
C++
面向对象的C++题目以及解法2
面向对象的C++题目以及解法2
33 1
|
13天前
|
C++
面向对象的C++题目以及解法
面向对象的C++题目以及解法
20 0
|
13天前
|
编译器 C语言 C++
【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装
【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装
|
13天前
|
存储 编译器 程序员
【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)
【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)
|
13天前
|
存储 程序员 编译器
c++面向对象概述、内存分析、引用、函数
c++面向对象概述、内存分析、引用、函数
|
13天前
|
存储 人工智能 数据安全/隐私保护
【C++面向对象】C++考试题库管理系统(源码)【独一无二】
【C++面向对象】C++考试题库管理系统(源码)【独一无二】
|
13天前
|
存储 人工智能 机器人
【C++面向对象】C++图书管理系统 (源码)【独一无二】
【C++面向对象】C++图书管理系统 (源码)【独一无二】