类的表示

一个类在类图中用矩形框表示,矩形框分为三层:

  • 类名
  • 类的成员变量:名称和类型
  • 类的方法:名称,参数类型和名称,返回值类型(也就是完整的函数签名)

对于成员变量和方法,使用不同的前缀代表访问修饰符:

  • 缺省代表default
  • +代表public
  • -代表private
  • #代表protected

对于一个抽象类或接口,它的类名以及抽象方法(留给子类实现的方法)名称使用斜体表示,以示区别。

类的关系

下面的几种关系讨论的都是两个类之间的关系,也可以理解为两个类的实例之间的关系。

对于满足后四种关系的两个类,如果屏蔽了其中一个类的定义,另一个类是无法通过编译的。 有的教程将后四种关系统称为关联关系,将聚合/组合/依赖关系视作特殊的关联关系。

继承与实现

继承和实现是类之间非常强的关系,在代码中的特征非常明显:

  • 继承关系(泛化关系)
    • 子类和父类之间的继承关系。
    • 在记号上使用带空心三角箭头的实线相连,空心三角箭头指向父类。
  • 实现关系
    • 类和接口之间的实现关系。
    • 在记号上使用带空心三角箭头的虚线相连,空心三角箭头指向接口。

这里的接口主要是针对Java的,Java虽然不支持多继承,但是提供了抽象类和接口,两者略有不同。 由于C++并没有提供接口,不妨将其理解为对抽象类的继承。

聚合与组合

聚合和组合是指两个类之间构成整体与部分的关系,在类中的体现通常为成员变量,按照生命周期区分:

  • 聚合关系
    • 部分可以离开整体而单独存在,两者生命周期可以不重合,例如车和轮胎的关系。
    • 在记号上使用带空心菱形的实线相连,空心菱形指向整体,有时另一侧用箭头指向部分。
  • 组合关系
    • 部分不能脱离整体而存在,两者生命周期完全重合,例如公司与部门的关系。
    • 在记号上使用带实心菱形的实线相连,实心菱形指向整体,有时另一侧用箭头指向部分。

关联与依赖

关联和依赖是两个类之间的使用关系(而非整体与部分的关系),需要知道对方的类的定义,属性和方法。两者按照使用方式区分:

  • 关联关系
    • 长期且稳定的关系。
    • 在类中通常体现为局部变量。
    • 在记号上使用最简单的实线相连,默认双向关联关系,并不需要强调方向性,对于方向性明显的关联也可以加上普通箭头。
  • 依赖关系
    • 通常是临时的关系,例如发生在方法的调用过程中。
    • 在类中可能体现为局部变量,方法的参数或返回值,或者对静态方法的调用等。
    • 在记号上使用带箭头的虚线相连,箭头指向被使用者。如果是双向依赖,两侧都需要加上箭头,尽量不要使用双向依赖。

文中的几个UML类图都是直接采用的网上教程链接,并没有将其复制到图床中。