类B是从类A中派生出来的,也就是说A是B的基类,而且是直接基类B是A的派 生类;类C是从类B中派生出来的,也就是说B是C的直接基类,C是B的派生类。对于C 类来讲除去B是它的直接基类外,A也是它的基类,但是是间接基类。由此,A,B,C这三个 类之间的继承关系就形成了一个类的层次 类的层次关系可以清楚有效地表示现实世界中事物的分类问题。 32.6单继承与多继承 根据我们已经介绍的继承的概念和类的层次,如图3.1所示即为类间的单继承关系。 从图中我们可以看出B类和C类是A类的派生类,A类是B 类和C类的基类;D类和E类是B类的派生类B类是D类和E类 C|的基类。由A,B,C,D,E所组成的是一种单继承的派生形式,即每 个派生类只是继承了一个基类的特性 使用单继承可以解决很多问题,但在不少场合,需要不同形式 的继承才能解决问题,单继承就似乎显得无能为力了。例如,在基于 图31单继承位映象的显示器上,用广界面所提供的窗口、滚动条、尺寸框以及多 种类型的按钮,假定所有这些都是通过类来支持的,假如要把所有这些类型合并成一个新类 型,这样,多继承的概念就产生了,所谓多继承就是在派生类中继承了不止一个基类的属性。 图3.2就是一个多继承的类层次的例子。 D类是A类和B类的派生类,A类和B类均是D类的直接「A1「B 基类。E类是B类和C类的派生类,B类和C类均是上类的接 基类,F类是D类、E类和C类的派生类,D类、C类和E类均是 F类的直接基类。A,B,CDE和F类形成了一个多继承的类层 D 次力 多重继承的引入,使面向对象系统大大增加了模拟世界的能 图3.2多继承 327面向对象系统的继承性 在面向对象系统中,引入继承机制后具有如下优点: ①能清晰体现相关类间的层次结构关系 ②能减小代码和数据的重复冗余度,大大增加程序的重用性。 ③能通过增强一致性来减少模块间的接口和界面,大大增加程序的易维护性。 ④继承是能自动传播代码的有力工具。 ⑤继承还是在一些比较一般的类的基础上构造建立和扩充新类的最有效的手段。 在面向对象系统中,若没有引入继承的概念,所有的类就会变为一盘各自为政、彼此独 立的散沙,每次软件开发就都要从“一无所有”开始 在面向对象系统中,继承性不仅作用在对操作的继承还作用在对数据内容的继承,即 既具有结构特性的继承性,又具有行为特性的继承性。 在面向对象系统中,派生类是否可以访问基类的所有数据成员和函数成员呢?我们以 C++为例来说明,在C++语言中,类的定义域分为三段:即私有段( private)、保护段
( protected)和公有段( public)。基类的成员若处在保护段和公有段中,派生类是可以访问 的;若基类的成员处在私有段中,派生类是无权访问的。 3.3多态性 多态性是面向对象系统中的又一重要特性,它描述的是同一个消息可以根据发送消息 对象的不同采用多种不同的行为方式 3.3.1重载的概念 在面向对象系统中,重载的含义是指通过为函数和运算符创建附加定义而使它们的名 字可以重载。也就是说相同名字的函数或运算符在不同的场合可以表现出不同的行为。 下面是一个C++语言中函数重载的例子: char *sIt int max(int a)(retur float max(float b)return b>x?b:x; 7 Ireturn strcmp(c, s1)>0?c: sI: k 在这里重载了三个函数,均为max,它们的功能为将函数的参数分别与类中各私有数据 比较大小。函数名相同,它们的差别在于函数参数的类型不同 当有求最大值的消息发送时,到底是执行这三个函数中的哪一个,也就是说到底要表现 出什么样的行为,这要看发送消息的对象是什么。通俗地讲在这里要看传递的函数参量是什 么,根据参量来调用不同的同名函数,假如发送的消息为max(10),则执行第一个max函 数,因为其参量为整型的 在定义函数重载时,函数名相同,但函数所带的参量的个数或类型必须有所区别,否则 就会出现二义性 在面向对象系统中除函数可以重载外运算符也可以重载。 332虚函数的概念 虚函数使用户在一个类等级中可以使用相同函数的多个版本每一个版本均属于类等 级中的不同的类,究竟使用的是哪一个特定的版本需要在运行中决定。 在C+十语言屮,虚函数在定义时,要在基类的此函数声明前加上关键字vrul,在派 生类中可重新给出定义。虚函数的各个版本中其返回值、函数参数的个数和类型必须是一 致的。至于在程序执行过程中究竟运行的是基类的版本还是某个派生类的版本,这要看当 时发送此消息的对象是属于哪一类的。 关于在C++语言中虚函数如何使用将在C++实践部分给出详细的叙述这里不再
举例。 3.3.3抽象类的概念 抽象类的作用在于将许多有关的类组织在一起,提供一个公共的基类,而那些被它组织 在一起的具体的类由它派生出来。它刻划了公有行为的特征,并通过继承机制传送给它的派 生类。 抽象类只描述与这类对象有关的协议和协议部分消息的部分实现,完整的实现留给它 的派生类来具体完成 抽象类是不能创建具体对象的类,即不能产生实例,只能建立它的派生类的对象。 在C十十语言中,通过在类中声明纯虚函数的方法来定义抽象类。下面是一个简单的例 lass shape public t void move (int, int) virtual void rotate(int)-0;∥定义纯虚函数 virtual void draw()+ //定义虚函数 }; class ab circle t public shape int radius; void rotate (int ) 在类 shape中存在纯虚函数 rotate,所以 shape为抽象类,ab- - circle为它的派生类。我 们不能建立 shape类的对象,只能建立 ab. circle类的对象。 34面向对象系统的多态性 面向对象系统的多态性指的是,当不同的对象收到相同的消息时产生不同的动作 C++语言支持两种多态性:即编译时的多态性和运行时的多态性。编译时的多态性是通过 使用重载来实现的到底执行的哪个重载版本在编译时就可以知道所以是相对静态的多态 性。运行时的多态性是通过虚函数来实现的到底运行的哪个函数版本需要在运行时通过 找出发送消息的对象来确定,编译器在编译时采用的是动态联编手段 练习题 (1)解释以下概念: ①封装,②协议,③继承,④单继承,⑤多继承 ⑥委托,⑦重载,⑧抽象类,⑥类的层次 (2)叙述面向对象系统的特性,它们在面向对象系统中起什么作用。 (3)继承性的引入是否削弱了类对象的封装性? (4)什么是多态性?在面向对象系统中多态性表现在哪些方面?
第章面向对象分析 我们在这里要叙述的面向对象分析主要是分析概念模型的建立过程。概念模型不是一 种客观存在的东西,它既不存在于信息系统中,又不存在于现实世界中,它只是人对现实世 界和信息系统的理解,是人的认识活动的产物,也是人的认识活动的工具。在本章我们将详 细讨论概念模型的建立。 4.I概愈模型 在介绍概念模型的建立之前,首先讨论一下为什么要建立概念模型以及有关它的基本 概念。 4.1.1为什么要建立概念模型 建立一个大型的信息系统并不是一件容易的事情,我们必须清楚地了解用户的需求,使 设计出的信息系统易于使用、修改和维护。在设计过程中我们总是要遇到许多米自各方面的 困难和阻力,它们主要表现在下面几点 ·开发人员对所设计的系统的应用领域缺乏了解; 不同的专业人员对所描述的概念的理解不一致 ·在系统分析阶段开发人员将面临大量繁杂的信息,这些信息管理得不好,将导致混 乱; 需求分析的结果无法确认;(这是由于用户总是以自己片面的眼光看需求规范,而不 能从整体上看待需求规范。) 开发人员操之过急地进入实现阶段。 从上面这些问题我们看出,需要一种帮助认识需求的工具,它能使用户和开发人员之间 充分地交流并达成一致,这个工具就是概念模型。 4.1.2概念间的关系 慨念是对实体属性的抽象和概括。实体之间是普遍联系的,概念之间也是普遍联系的 概念之间有一种静态联系,这种静态联系是与实体的概念结构、属性相关的。这种静态 联系表现为三种形式: (1)属性关系即一个实体概念是另一个实体概念的属性。例如“人的姓名”与“人” 之间就是这样一种属性关系。 (2)层次关系即一个实体概念是另一个实体概念的上位概念。例如类A是类B派 生出来的则它们之间为层次关系
(3)并列关系有两个实体概念都是同一实体概念的下位概念,但这两个实体概念 的外延不相交。例如A类、B类均为C类的派生类,则A类和B类之间是并列关系 在概念之间除去静态关系外,还具有一种动态关系,它是由行为概念反映出来的。这种 为概念是行为的客体概念、主体概念结果概念联系纽带,又可以作为客体概念、主体概 念等的属性。 此外,在实体与概念之间还存在着一种“值与型”的关系,即实例与类的关系。 413信息系统的概念模型 所谓慨念模型,就是用户和系统开发人员对系统所涉及到的客观事物及其关系的理解, 表现为一组相关的概念。它是一个由一组概念通过各种概念间关系组成的概念体系,抽象地 描述了信息系统对象的结构和行为两方面的特征和关系。 概念模型不是凭空构造出来的,而是依赖于特定的建模方法,在信息系统中经常使用实 体—联系方法(即ER图法)来描述概念模型。 在ER图法中,有三个基本符号—长方形椭圆形和菱形: ①用长方形表示实体集(类),在方框内写上该实体的名字(类名),如“学生”、“课程” 学生 课程 ②用椭园表示属性在椭圆内记上属性名如“学号”、“姓名”等,如: 学号 姓名 ③用菱形表示关系,关系名写在菱形中。例如学生和课程之间的关系“SC”,如: 在信息系统中建立概念模型具有以下几个作用: ①作为一个公共的参考框架,在系统分析阶段用以进行用户和开发人员之间的交流 ②帮助开发人员理解应用领域和用户需求。 ③作为数据模型的设计依据,也可用于检验和评价系统设计。 ④作为文档资料的一部分,在维护阶段有利于系统的修改和扩充。 ⑤帮助用户从整体上理解和认识信息系统。 42用面向对象方法建立概愈模型 在前面我们介绍了用ER图法来建立概念模型用ER图方法只能反映概念间的静态 关系,无法反映动态关系。要想体现这种动态关系,只能使用面向对象的方法。面向对象的 方法是一种更直观、更自然、更易于理解的概念模型化方法 4.2.1识别对象和类 要建立信息系统,先要弄淸楚在建立信息系统之前,人们是如何处理信息的,信息系统