目录
前言
在学习面向对象语言时,我们可以使用UML类图来描述将要编写的程序中类与类之间的关系。绘制类图可以让程序员更清晰的感知类与类之间的关系,进而编写出更符合需求的代码。(博主使用的是“亿图图示”中的绘制工具,当然你也可以选择其他的工具,该软件在网上有破解版,推荐读者使用正版,读者可自行查找,这里就不进行安装引导了。)
注意:本博文使用C++作为代码演示语言。
一、如何在UML中表示一个类
打开绘图软件后,向绘制面添加一个类,我们可以看到一个类通常由3块区域组成,
在第一部分中要填入的是我们的类名。
在第二部分中要填写该类中包含的成员的可见性(私有、公有、保护)。而后填写类的属性字段、属性名、是否有缺省值。
在第三部分中要填写的是在该类中包含的类方法的可见性、类名、类参数、返回值。
这里简单解释一下普通类与抽象类与接口类的关系:
普通类中没有纯虚函数,抽象类中至少有一个纯虚函数但也可以包含非纯虚函数,接口类中只能包含纯虚函数。
二、类之间关系的表示
1.继承关系
继承关系本质上是一种“is-a”的关系。假设在一个学校中,只有学生和老师两类人,显然老师和学生都有着一些共同的属性,我们将这些共同的属性提取出来作为基类,而后在对学生和老师之间差异的部分做描述形成学生类和老师类,最后让老师类和学生类继承公共类即可。
在UML类图中,继承关系用带空心三角箭头的实线来表示,由派生类指向父类。
2.关联关系
与继承关系不同,关联关系是一种引用的关系,是一种“has-a”的关系。比如说一个动物园的类,动物园中有很多的动物,但是动物园和动物之间是包含关系。
①单向关联
单项关联指的是一个类中包含另一个类作为成员变量。比如描述一个人的类可以有一个记录地址的类,但是记录地址的类不能包含一个人的类。单项关联用一条带箭头的实线来表示。其中箭头指向被包含的一方。
②双向关联关系
双向关联关系是两个类互相包含对方类作为成员变量。比如一个部门类与员工类,员工需要知道自己所属的部门,部门也需要知道有多少员工。双向关联关系用一条实现链接有关系的两方即可。
③自关联关系
自关联关系是在该类中包含该类类型的成员变量。常见于链表中,我们知道链表是由一个个节点组成的,一个节点类中一定包含对一个或多个节点指针,用来与其它节点链接。自关联关系用一个带箭头的实线指向自己表示。其中箭头指向自己。
3.聚合关系
聚合关系是一种较为强烈的关联关系,是部分与整体的关系,表示部分的类,可以独立于整体存在。比如我们想描述一个种群,种群中的个体可以脱离种群存在。我们使用一个带空心菱形的实线来表示聚合关系,其中空心菱形靠近整体类。
4.组合关系
组合关系是一种更强烈的聚合关系,在组合关系中的部分类不能脱离整体类存在,整体类销毁时,不分类也一定会被销毁。比如一个房屋包含卧室和客厅,当要拆除这个房屋的时候,卧室和客厅也会被一并拆除。组合关系通常使用一条带实心菱形的实线来链接,实心菱形靠近整体类。
5.实现关系
在C++中,实现关系,通常指的是接口类与实现类之间的关系。接口类与实现类之间的关系好比C++标准委员会提出对应的标准但是不会去实现,各编译器厂商根据提出的标准实现对应的功能。我们这里举一个例子,我们有一个动物类,在这个类中只有一个描述动物叫声的纯虚函数,因为动物具体的叫声是不确定的,所以需要实现类对这一函数进行具体实现。实现关系通常使用带空心三角箭头的虚线表示,箭头靠近接口类。
6.依赖关系
依赖关系是一种使用关系,这种关系是临时的。比如说一个描述文档的类,和一个打印机的类,打印机的字段属性不包含文档类,但是如果打印机想要实现打印方法,就必须要使用文档类读取文档中的内容,这时文档类在打印机这个类中的打印方法中作为临时变量或者方法参数被使用了。这种关系就是一种依赖关系。描述依赖关系使用带箭头的虚线表示。箭头靠近被依赖的一方,这里就是指向文档类。