主讲:赵英良
计算机教学
实验中心 第 17单元
面向对象方法
计算机软件基础
The software basic of computer
第 2 页
教学目标、内容
? 了解面向对象程序设计的基本概念
? 了解面向对象程序设计的特点
第 3 页
本单元涉及内容
? 第 11章 面向对象的软件开发方法
11.1 面向对象方法概述
? P325 ~ P333
第 4 页
一、面向对象的基本概念
?,面向对象 ( Object Orented)
,简称为, OO”。 这是目前计算
机业界使用的高频词
?, OO”代表着一种新的思维方式
? 代表着一种新的程序设计方法的
潮流 。
第 5 页
1.什么是面向对象方法 (思想 )
? 传统的程序设计方法,不论是需求分析,还是系统设计,
都是针对数学模型的,出发点是, 怎样做( How)?,,
即用计算机求解这个实际问题应该, 怎样做?, 。从实
际问题到求解模型(数学模型)的抽象都是围绕, 怎样
做?, 去进行的。
? 现实世界是由物质组成的,物体的形式是多样化的,这
就是问题域( Domain)。人认识事物的规律:首先是认
识这个问题域,它, 是什么?, 。当物体反映到头脑中
后,变成意识,得到抽象的概念,及所谓逻辑世界。
? 逻辑世界是由对象组成的 。对象在具体的逻辑世界中担
当一定的角色,并完成一定的功能(动作);对象有自
己的属性和动作。, 对象, 表现现实世界中的某个具体
的事物。
第 6 页
? 面向对象( OO)方法的出发点是:, 是什么
( What)?,,即要求解的实际问题,它到
底, 是什么?。
?, 面向对象, 技术 追求 的是软件系统 对现实
世界的直接模拟, 尽量实现将现实世界中的
事物直接映射到软件系统的解空间 。
? 面向对象的程序设计技术是 以对象为基础,
以消息驱动 对象 实现操作 的一种全新的程序
设计方法 。
第 7 页
面向对象程序设计 OOP—OOProgramming
? OOP是软件系统设计与实现的新方法 。
? OOP将数据及对数据的操作放在一起, 作为一个相互依
存, 不可分割的整体来处理 。
? OOP采用数据抽象和信息隐藏技术, 它将对象和对对象
的操作抽象成一种新的数据类型 ——类 。 拓宽了描述复
杂现实问题的能力 。
? OOP方法是通过增加软件的可扩充性和可重用性来改善
并提高软件的生产率的 。
? OOP的特点,
?继承了 SP的优点 ( 任务分解, 模块化 )
?抽象数据类型 ADT
?继承性, 封装性, 可重用性
第 8 页
2.面向对象方法产生的 背景
? 软件的巨大作用 计算机技术的发展, 极大推动了社会
的发展 。 而社会的发展又给计算机科学提出了新的要求 。
计算机科学只有不断进行自身提高和完善, 才能适应不
断进步的社会生产力的需要 。
? 传统方法的历史功绩 传统的程序设计方法对, 软件生
产工程化, 曾起过重要的促进作用, 部分缓解了软件危
机, 用传统方法成功地指导软件开发的范例也很多 。
? 软件危机 但是, 传统的方法学并不能完全消除软件危
机, 用传统方法开发软件的生产率已远远不能满足要求,
成为计算机科学发展的阻力 。
? 面向对象方法( OO) 就是在这种背景下诞生的,它使
业界看到了成功的希望。同时也促使 OO方法和技术的研
究得到迅速发展。
第 9 页
3.传统程序设计方法存在的问题
? 生产率提高的幅度远不能满足需要
? 软件重用程度很低
? 软件维护困难
? 软件不能真正满足用户的需要
第 10 页
(1)生产率提高的幅度远不能满足需要
? 生命周期方法学强调需求分析的重要性, 强调
每个阶段结束之前必须进行严格的评审和质量
把关, 这确实加快了软件开发的速度 。 但所产
生的开发率的提高, 远远赶不上对软件产品需
求率的增长 。
? 据统计资料表明, 从 50年代到 80年代的 30年间,
美国的软件生产率翻了两翻 。 但社会对软件的
需求每年以两位数字的百分比在增长 。 软件的
开发, 已成为影响计算机应用的巨大桎梏和瓶
颈 。
第 11 页
(2)软件重用程度很低
?,重用, 也称, 再用, 或, 复用,, 是指同一事物
不经修改或稍加修改就可以多次重复使用 。 显然,
软件重用是节约人力, 提高软件生产率的重要途径 。
? 传统的程序设计方法没能很好地解决软件重用问题 。
建立标准函数库和子程序库是人们为追求提高软件
的可重用性做出的尝试 。 但事实证明, 标准函数库
和子程序库只是对建立在数学模型基础上的应用问
题有可重用的功效, 而对其它应用问题则不行 。
? 对于传统的 SA-SD-SP技术而言, 思维成果的可重用
性很差 。
第 12 页
(3)软件维护困难
? 按生命周期方法学开发出的软件, 维护成本很
高, 据统计数据表明, 软件维护的生产率比软
件开发的生产率低几十倍 。
? 80年代, 美国一年花费的软件维护费用高达
300多亿美元 。
? 90年代, 软件维护费用占系统研制, 开发总费
用的 70%-80%。
第 13 页
(4)软件不能真正满足用 户的需要
? 实践表明, 用传统方法开发的大型应用系统往往不能
真正满足用户的需要 。 在美国, 开发出的系统中:
?符合用户需要并顺利投入使用的系统仅占总数
的 1/4;
?中途夭折的系统占 1/4;
?将近 1/2的系统, 虽然完成了开发过程, 但并未
被用户采用或并未被长期使用 。
? 还表现在:
?开发人员不能完全获得或不能彻底理解用户的要求,
以致开发出的软件系统与用户预期的系统不一致,
不能满足用户的需要 。
?所开发出的系统不能适应用户经常变化的情况, 系
统的稳定性和可扩充性不能满足要求 。
第 14 页
现实世界与 OO系统的对应关系
? OO方法是将现实世界抽象为, 对象是什么?,, 所以说, OO方法
是更高一级的抽象 。 它和人认识现实世界的方法是一致的 。
现实问题空间 面向对象解空间
物质:
一辆白色的自行车
意识:
自行车
具体事物:
一个对象 ——自行车的实例
抽象概念:
自行车类
?现实世界中事物分为两大部分:物质和意识;前者表示是具体的事
物,后者描述的是某个抽象的概念。
?现实世界中,“一辆白色自行车”是客观存在,是物质的;而自 行
车是人脑中一个抽象的概念,是主观意识;
?在 OO系统中自行车用“自行车类”来表达,“一辆白色自行车”
是一个具体的对象,是自行车类的一个实例。
第 15 页
4.OO方法及其 4个要点
? ( 1) 概念, LOO方法是基于对象, 类, 继承, 消息机制,
多态等技术特征的构造系统的软件开发方法 。
? ( 2) 客观世界由各种对象组成 。 OO的软件系统也是由对象
组成的;任何复杂的软件都是由简单的对象组合而成的;
? ( 3) 所有对象都可以划分为不同的对象类 ;每个对象类都
有自己特定的数据和方法;
? ( 4) 对象类具有层次结构 ;上层的类称为, 父类, 或, 基
类,, 下层的类称为, 子类, 或, 派生类, 。 子类可以继
承父类的特性及操作;
? ( 5) 对象之间通过传递, 消息, 互相联系 ( 消息机制 ) 。
OO方法 = 对象 + 类 + 继承性 + 消息机制
第 16 页
5.OO方法的主要优点
? (1)与人类习惯的思维方法一致
? (2)稳定性好
? (3)可重用性好
? (4)可维护性好
第 17 页
(1)与人类习惯的思维方法一致
? 人的认识过程是从一般到特殊的渐进思维过
程, 是从, 是什么?, 开始, 认识事物及其
本质规律, 主观随意性受到限制 。
? 而传统方法是从, 怎样做?, 开始, 到, 做
什么?,, 反认识规律而动, 主观随意性太
多 。
第 18 页
(2)稳定性好
? 传统方法以, 过程为中心,, 完全基于功能分
析和功能分解 。 当功能需求发生变化时, 将引
起对软件结构整体的修改, 这样的系统是不稳
定的 。
? OO方法以, 对象为中心,, 它是以对象模拟问
题领域中的实体, 以对象间的联系描述实体间
的联系 。 在分析, 研究对象及其属性的过程中
根据其内在的规律建立求解模型 。 基于这种方
法建立的软件系统, 不管功能需求如何变化,
其内在规律不变, 因而不会引起软件系统结构
的整体变化 。 因此是稳定的 。
第 19 页
(3)可重用性好
? OO方法采用封装机制和信息隐藏机制, 使其
内部实现与外界完全隔离, 具有较强的独立
性 ( 对象对外界而言, 好象一个, 黑匣子
,) 。 较好地解决了, 软件复杂性控制, 问
题 。
? OO方法中类的继承性是一种代码重用的有效
途径 。 开发者在设计软件的过程中, 将一些
精心设计, 测试过的代码不断加入到已有的
类库中 。 而类库是可供共享的代码库 。
? 因此用 OOP开发的软件具有较好的可重用性 。
第 20 页
(4)可维护性好
? 稳定性较好 局部修改, 不影响大局,
错误不会传播;
? 易修改 封装性和信息隐藏机制
? 易于阅读, 理解 符合人类习惯的思维
方法, 对原系统所做的修改, 往往通过在
原有类的基础上派生一些新类即可实现,
易于贯通 。
? 易于测试和调试 派生类继承原有类的
特性, 只需测试新增加的特性即可 。
第 21 页
6.面向对象程序设计语言 OOPL
? OOPL有两个显著的特征,
? 抽象数据类型 (ADT)
? 继承性
? OOPL要提供:
? 特定的语法成分来保证和支持 OOP;形式上
要能够表现,语义上要能够处理;
? 继承性, 多态性和动态链接机制, 使得类
和类库成为可重用的程序模块 。
第 22 页
面向对象程序设计语言的发展史
? LISP语言 50年代末发展起来的一种符号处理语言, 是一
种人工智能语言 。 1979年推出 Flavors是 LISP的 OOPL版本 。
? Simula语言 60年代开发, 在 ALGOL60的基础上扩充 。 主
要用于模拟 。 具有表加工等功能 。
? SmallTalk语言 第 1个真正的 OOPL,它体现了纯粹 OOP设
计思想 。 它起源于 Simula,是最成功的一个版本 。
? C家族 C++是在 C基础上扩充, 增加了对象处理机制, 将
,类, 看作是用户定义类型 。 由于 C++的出现, 才使 OOPL
越来越得到重视和广泛的应用 。 C++有许多种类,MS C++、
Turbo C++,Borland C++ 和 Visual C++等 。
? 其它语言 的 OO版本有,Turbo PASCAL,Object PASCAL、
Visual Basic等 。
第 23 页
7.实体和对象
? 实体 客观存在的事物 。 客观世界中的问
题都是由实体及其相互之间的关系构成的 。
? 对象 客观世界中的 实体 均可以抽象为问
题空间中的 对象 。 可以将要研究的任何事
物作为对象;大到航天飞机, 宇宙天体,
工厂, 学校, 小到一个学生, 一本书 。 对
象可以是 具体实体, 还可以表示 抽象实体,
例如规则, 算法, 事件等 。
第 24 页
( 1)对象 ——Object( OO中的对象)
? 考虑问题的角度不同, 对对象的定义也不同:
?对象是具有相同状态的一组操作的集合
( 从 OOP的角度看 )
?对象是对属性值和操作的封装
( 从信息模拟的角度看 )
?对象是存储在计算机中的一块私有存储区(具有数据、
也有对数据进行操作的方法) (从存储的角度看) ;
?对象,:={ ID,DS,MS,MI}
ID 标识符 MS 操作集合
DS 数据结构 MI 消息集合 ( 值 )
(形式化定义 )
对象是封装了数据和操作的黑匣子
第 25 页
( 2)对象的三个特征
? 标识 用来区别其它对象;
? 状态 用来描述对象的属性, 用数据成员来表示;
? 行为 对对象的操作, 用于改变对象的状态;
行为分两类:
?自身所承受的操作
?施加于其它对象的操作
? 例如, 一个人叫王东, 男, 1.80M,68kg,会修电器,可教计算
机课 。 描述如下:
对 象 名, 王东
对象状态, 性别:男 身高,1.80m 体重,68kg
对象功能,
回答身高, 体重, 性别 ( 属于自身所承受的操作 )
修理电器, 教计算机课程 ( 属于施加于其它对象的操作 )
第 26 页
? 可以把对象看成是一个封装了数据和操作的黑匣子
( 实体 ) 。
数据描述了对象的状态
属性表示对象的结构特征
操作可以改变对象的状态
通过传递消息实现对象的操作
第 27 页
自动机模拟对象举例
? 对象中的数据表
示对象的状态,
一个状态只能由
该对象的操作来
改变 。 每当需要
改变对象的状态
时, 只能由其它
对象向该对象发
出消息 。 对象响
应消息时, 按照
消息模式找出与
之匹配的方法,
并执行该操作 。
状态
S
输出
fi(x,s)
输入
fi,x
操作, f1,f2,…,fn
转换,g1,g2,…,gn
转换, 新状态 S’=gi (x,s)
第 28 页
( 3)对象的特点
? 以数据为中心 所设操作都与数据要做的处理有关 。
? 对象是主动的 与传统的数据有本质不同, 不是被动
地等待对它进行处理;相反, 对象本身是进行处理的
主体 。
? 实现了数据封装 对象的私有数据完全被封装在内部,
对外是不可见的 。 要使用对象的私有数据, 只需知道
数据的取值范围和可以对该数据施加的操作, 根本无
须知道数据的具体结构以及实现操作的算法 。 这就是
抽象数据类型 ( ADT) 的概念 。
? 本质上具有并行性 不同对象各自独立地处理自身的
数据, 彼此通过发消息传递信息完成通信 。
? 模块独立性好 对象的内聚性强, 对象间的耦合性弱 。
第 29 页
8.类 ——Class
? (1)类的概念
? 人们习惯于把有相似特征的事物归为一类, 分类是人
类认识客观世界的基本方法 。
? 在 OO方法中,, 类, 就是对具有相同数据和操作的一
组相似对象 。
? 例如,, 人, 类, 可以是黑人, 白人, 可以是教师,
工人等, 他们具有相同的人类特征和行为特征 。
? 类是 OO技术中最重要的概念 。 OOP中所有的操作都可
归结为对类的操作 。
? 类形成了一个具有特定功能的模块和一种代码共享的
手段 。 它为程序员提供了一种工具, 使得可方便地建
立所需要的任何类型 。
第 30 页
C++中对象类的定义举例
CLASS person {
Private,&& 私有数据和操作
char name[20];
int age;
cahr address[40];
char sex[10];
void PrintName( );
viod PrintAge( );
void PrintAddress( );
void PrintSex( );
Public,&& 公有操作
void Print( ) {
PrintName( );
PrintAge( );
PrintAddress( );
PrintSex( ); }
};
结构特征
数据成员
行为特征
成员函数
第 31 页
( 2)类层次
? 对象类描述的问题可以是一个点,也可以是一个方面 。 类的
层次结构称为类层次 。 处于上层的称为, 父类, 或, 基
类,, 处于下层的称为, 子类, 或, 派生类, 。
? 例如,, 人, 类是一个类层次;
工人, 农民, 学生, 教师是
,人, 类的派生类;
中学生, 大学生,
研究生是, 学生,
类的派生类, 研究
生, 助教, 讲师,
教授是, 教师, 类
的派生类 。
工人
人
中学生
教师 农民学生
大学生 研究生 助教 讲师 教授
父类
派生类
第 32 页
( 3)类格结构
? 将子类具有一个以上
父类的类层次结构称
为 类格结构 。
? 例如,
研究生子类;有在职
研究生, 他们在读学位
的同时, 还要承担教学
任务 。 类格结构用来描述具有多重隶属关系 ( 多重属
性 ) 的对象类 。
教师学生
研究生
第 33 页
9.实例 ——Instance
? 组成类的对象, 都是该类的实例 。
? 类与实例之间的关系, 可以看成是抽象与具体的关系 。
类是多实例的综合抽象, 而实例又是类的个体实物 。
? 例如,, 书, 是一个对象类, 而, 软件工程导论, 则
是, 书, 类的一个实例 。
? 实际上类是建立对象时使用的样板, 按照这个样板所
建立的一个个具体的对象, 就是类的实例例子 。
第 34 页
10.消息 ——Message
? 前面举例中人的对象 ——王东 。 他可以修理电器, 讲计
算机课;这是他为别人可提供的服务 。 他还接受其它对
象的服务, 例如吃饭, 穿衣等 。 他要请求别人解决这些
问题 ( 因为他不生产粮食和服装 ) 。 这里的, 请求, 就
是人与人之间进行交互的手段 。 同样, 它什么时候修理
电器, 什么时候讲课, 都要得到其他对象的请求后才进
行 。
? 在面向对象的技术中,, 请求, 就是发送的, 消息, 。
消息是对象之间相互请求或相互协作的途径, 是要求某
个对象执行其中某个功能操作的规格的说明 。
? 发送消息的对象称为 发送者, 接收消息的对象称为 接收
者 。 对象间的联系, 只能通过传递消息来进行 。 对象也
只能在收到消息时, 才被激活 。 被激活后的对象代码将
按消息中的命令去操作它的私有数据, 完成要求的功能 。
第 35 页
( 1)消息的定义
? 将操作送到目标对象的一种机制称为消息 。 它
包括操作名的选择和传递, 操作信息的变量有
三个部分:
?接收消息的对象
?消息选择符
?变元
? 例如, 增加公司的操作,JFM( 一汽集团公司 )
JFM,Add子公司 ( ?奥迪 1000? )
操作变量 操作名 目标对象
“Add子公司”操作 将‘奥迪 1000’加入到 JFM中,当 JFM
接到该消息后,就执行,Add子公司”的操作。
第 36 页
( 2)消息的性质
? 同一对象可接收不同形式的多个消息, 产生不
同的响应;即
1个对象 M个消息 M个动作
? 相同形式的消息可以送给不同的对象, 所做出
的响应可以是截然不同的;即
M个对象 1个消息 M个动作
? 消息的发送可以不考虑具体的接收者, 对象可
以响应消息, 也可以对消息不予理会, 对消息
的响应并不是必须的 。
第 37 页
( 3)消息类型
? 公有消息 在某个对象的一批消息中, 由外界
对象直接向它发送的消息, 称为公有消息 。
? 私有消息 在某个对象的一批消息中, 不对外
发放, 由对象自己向本身发送的消息, 称为私
有消息 。
? 前面介绍的对象类 person中, print( )是公有
消息,其它 (PrintName(),PrintAge()等 )为私
有消息 。 外 界对 象 只 能 向 person对象 发 送
print()消息 。
? 另外还有
? 可返回对象的内部状态的消息;
? 可改变对象的内部状态的消息;
? 可以做一些特定的操作, 改变系统状态的消息 。
第 38 页
消息序列
? 即接收或发送一系列的消息 。 在 OO系统中就是用消息序列来表述要解决的一
系列问题的 。 例如, 定义类 person和类 course如下:
Class person { class course {
char Name[20]; char Cname[20];
int Age; int roomno;
char Major[20]; char Ctime[20];
int Score;
public,public:
void print() {cout <<Name<<Age<< //……..
Major<<Score;} void print() { cout<<Cname<<
void printName(){cout<<Name;} roomno<<Ctime;}
void printAge(){cout<<Age;} };
void printMajor(){cout<<Major;}
void printScore(){cout<<Score;}
};
void f1(person P) void f2(person P,course C)
{ P.printName(); { P.print();
P.printAge(); C.print();
P.printMajor(); }
P.printScore(); 函数 f1向 person类对象 P发送了 4个打印消息 ;
} 函数 f2向 person类对象 P和 course类对象 C各发 1个消息,
第 39 页
11.事件( Event)
? 在自然界中,各种动物都能够对刺激作出反应。在程序
设计中,对象只有具有相同的反应能力,才能实现要求
的功能。对象对外界的刺激能够作出反应就是用 事件 和
方法 来模拟和实现的。
? 当用户对某一对象有操作意图的时候,通过外部设备
(鼠标、键盘等)输入必要的信息,计算机不但能够判
断出事件的性质,而且能够判断出事件的特征,从而给
对象一个准确的刺激,使对象进行预定的反应行为。
? 刺激对象的方式很多;例如,单击鼠标左键,计算机将
接收到一组信号,确定鼠标单击事件的发生,而事件的
特征,包括鼠标的位置、鼠标的激活键等信息也同时被
计算机接收,与对象联系起来,于是启动对象中对的事
件处理程序,进行事件的处理。
第 40 页
12.方法( Method)
? 对对象的处理称为 方法 或 操作 。 它包括控
制和操作过程 。
? 方法描述了对象执行操作的算法, 响应消
息的方法,
? 在 C++中称为 成员函数 。
? 例如:
ADD子公司 ( )
Print( )
第 41 页
13.属性( Attribute)
? 对象中的数据称为 属性, 它是对实体
所具有的性质大抽象 。
? C++中把属性称之为 数据成员 。
? 例如:
char name[20];
int age;
第 42 页
二、面向对象方法的特点
? OO方法的抽象技术
? OO方法的封装技术
? OO方法的继承机制
? 多态
? 消息机制
第 43 页
1.OO方法的抽象技术( Abstraction)
? 抽象是指将实际问题化简为计算机能处理和表示的形式 。
? OO方法比其它已有方法从应用设计到解决方案有更高的抽象性和
更好的对应性 。
? 主要原因是 (抽象技术的特征 ):
? 对象具有极强的抽象表达能力 OO方法采用对象来表达一切事
物 。 由于对象具有不同的属性, 使得 OO方法具有很强的建模能
力 。
? 对象实现了抽象的数据类型 在对象抽象的基础上, OO方法更
进一步提出对象类的概念, 从而实现了更高层的抽象 。 用户可
以根据实际问题的需要, 自定义对象类的机制被称为, 抽象的
数据类型,, 它使 OO方法具有更强的解决复杂问题的能力 。
? 规范化的抽象方法 OO方法的抽象技术更加接近于人类认识客
观事物的思维方法 。 寻找要求解的对象实体, 研究其属性和功
能, 再根据实体的性质, 功能将它们组成不同的功能模块 。
第 44 页
2.OO方法的封装技术( Encapsulation)
? 在程序设计中, 封装是指将数据及与这些数据有关的操
作集合放在一起, 形成一个能动的实体 ——对象 ( 黑匣
子 ) 。
? 用户不必知道对象行为的实现细节, 只要根据对象提供
的外部特征及接口来访问对象 。
? 所谓, 封装性, 是一种信息隐藏技术, 其目的是将对象
的设计者和对象的使用者分开 。
? 对象的封装性体现在:
?具有清楚的边界 对象的数据结构和操作限定于其中
?具有统一的外部接口 ( 也称消息模式 ) 它描述了对
象之间的相互作用, 请求和响应
?代码保护 对象内部的实现代码受到封装壳的保护,
其它对象不能直接修改本对象所拥有的数据和代码 。
第 45 页
封装机制的目的
? 将对象的使用者和设计者分开 ;使用者
不必知道对象行为实现的细节, 只需用
设计者提供的协议 ( 消息 ) 命令对象去
实现其动作 。
? 协议 ( Protocol) 是一个对象对外服务
的说明, 它声明对象可以为外界做什么 。
请求对象进行操作的唯一途径就是通过
协议中提供的消息进行的 。 协议实际上
是一个对象所能接受的所有公有消息的
集合 。
第 46 页
STUDENT对象类举例
class student {
private,私有功能,changemark只供
char *name; 对象自己使用
int mark;
char *major ; void changemark( ) ;
public, 公有功能,getname和
char *getname( ) ; getmajor可供外界
char *getmajor( ), 对象使用
protected:
int getmark( ) ; 被保护功能,getmark,虽向外
}; 界公布, 但只能
由为排生类对象提
供服务 。
第 47 页
3.OO方法的继承机制 (Inheritance)
? 继承所表达的是一种对象类之间的相互关系,它使
得某类对象可以继承另一类对象的特征和能力 。
? 继承性的含义是:自动共享类的对象的全部特征的
一种机制 。 它包括:
?继承性 新的对象自动继承该类的特征;
?继承传递性 子类自动继承其父类的特征;对多
层类结构, 下层子类可以继承其上各层父类的
特征;
?多重继承性 子类可以从它的多个父类 ( 超类 )
中继承它们的特征 。
第 48 页
继承性举例
? 在, 人, 类中, 大学生可以继承, 人, 和, 学生,
的特征 ( 继承传递 ) ;对于在职研究生既可以继承
,学生, 的特征, 又可以继承, 教师, 的特征 ( 多
重继承 ) 。
人
身份证号:
姓名:
学号:
校名
学生
大学生
专业:
班级:
身份证号,xxxxxxx
姓名:刘小明
学生,学生,9601078校名:西安交通大学
大学生,专业:计算机班级,962班
人:
第 49 页
具有继承关系的对象的特性
? 对象类间具有共享特征 ( 包括数据和程序代
码的共享 )
? 对象类间具有细微的差别或新增部分 ( 包括
非共享的程序代码和数据 )
? 对象类间具有层次结构 。
? 继承所具有的作用有两个方面:
?减少代码冗余
?通过协调性减少相互之间的接口和界面 。
第 50 页
继承的分类
? 从继承源上划分为:单继承和多继承
?单继承 一个人只能继承一个人的财产
?多继承 一个人既可以继承父母的财产,又可以继承其
他亲属的财产。
? 从继承内容上划分为:取代, 包含, 受限和特化继承 。
?取代继承 徒弟掌握了师傅所有的技术, 在任何需要师
傅的地方都可以由徒弟来代替;
?包含继承, 水果, 是一类对象,, 苹果, 是一种特殊
的水果 。, 苹果, 继承了, 水果, 的所有特征;任何一
个苹果都是一个水果, 即苹果包含了水果具有的所有特
征;
?受限继承, 驼鸟, 是一种特殊的鸟, 它不能继承鸟会
飞的特征;
?特化继承, 工程师, 是一类特殊的人, 他们比一般人
具有更多的特有信息 。
第 51 页
继承性的优点
? 能清晰体现相关类间的层次结构关系;
? 可大大增加代码的重用性;
? 通过增强一致性来减少模块见的接口和
界面, 大大增加可维护性;
? 是自动传播代码的有利工具
? 在一般类基础上构造, 建立, 扩充新类
的最有效的手段 。
第 52 页
作业、思考题
? 思考:
第 11章的 1.~9.
? 预祝同学们考出好成绩。
谢谢!再见!
计算机教学
实验中心 第 17单元
面向对象方法
计算机软件基础
The software basic of computer
第 2 页
教学目标、内容
? 了解面向对象程序设计的基本概念
? 了解面向对象程序设计的特点
第 3 页
本单元涉及内容
? 第 11章 面向对象的软件开发方法
11.1 面向对象方法概述
? P325 ~ P333
第 4 页
一、面向对象的基本概念
?,面向对象 ( Object Orented)
,简称为, OO”。 这是目前计算
机业界使用的高频词
?, OO”代表着一种新的思维方式
? 代表着一种新的程序设计方法的
潮流 。
第 5 页
1.什么是面向对象方法 (思想 )
? 传统的程序设计方法,不论是需求分析,还是系统设计,
都是针对数学模型的,出发点是, 怎样做( How)?,,
即用计算机求解这个实际问题应该, 怎样做?, 。从实
际问题到求解模型(数学模型)的抽象都是围绕, 怎样
做?, 去进行的。
? 现实世界是由物质组成的,物体的形式是多样化的,这
就是问题域( Domain)。人认识事物的规律:首先是认
识这个问题域,它, 是什么?, 。当物体反映到头脑中
后,变成意识,得到抽象的概念,及所谓逻辑世界。
? 逻辑世界是由对象组成的 。对象在具体的逻辑世界中担
当一定的角色,并完成一定的功能(动作);对象有自
己的属性和动作。, 对象, 表现现实世界中的某个具体
的事物。
第 6 页
? 面向对象( OO)方法的出发点是:, 是什么
( What)?,,即要求解的实际问题,它到
底, 是什么?。
?, 面向对象, 技术 追求 的是软件系统 对现实
世界的直接模拟, 尽量实现将现实世界中的
事物直接映射到软件系统的解空间 。
? 面向对象的程序设计技术是 以对象为基础,
以消息驱动 对象 实现操作 的一种全新的程序
设计方法 。
第 7 页
面向对象程序设计 OOP—OOProgramming
? OOP是软件系统设计与实现的新方法 。
? OOP将数据及对数据的操作放在一起, 作为一个相互依
存, 不可分割的整体来处理 。
? OOP采用数据抽象和信息隐藏技术, 它将对象和对对象
的操作抽象成一种新的数据类型 ——类 。 拓宽了描述复
杂现实问题的能力 。
? OOP方法是通过增加软件的可扩充性和可重用性来改善
并提高软件的生产率的 。
? OOP的特点,
?继承了 SP的优点 ( 任务分解, 模块化 )
?抽象数据类型 ADT
?继承性, 封装性, 可重用性
第 8 页
2.面向对象方法产生的 背景
? 软件的巨大作用 计算机技术的发展, 极大推动了社会
的发展 。 而社会的发展又给计算机科学提出了新的要求 。
计算机科学只有不断进行自身提高和完善, 才能适应不
断进步的社会生产力的需要 。
? 传统方法的历史功绩 传统的程序设计方法对, 软件生
产工程化, 曾起过重要的促进作用, 部分缓解了软件危
机, 用传统方法成功地指导软件开发的范例也很多 。
? 软件危机 但是, 传统的方法学并不能完全消除软件危
机, 用传统方法开发软件的生产率已远远不能满足要求,
成为计算机科学发展的阻力 。
? 面向对象方法( OO) 就是在这种背景下诞生的,它使
业界看到了成功的希望。同时也促使 OO方法和技术的研
究得到迅速发展。
第 9 页
3.传统程序设计方法存在的问题
? 生产率提高的幅度远不能满足需要
? 软件重用程度很低
? 软件维护困难
? 软件不能真正满足用户的需要
第 10 页
(1)生产率提高的幅度远不能满足需要
? 生命周期方法学强调需求分析的重要性, 强调
每个阶段结束之前必须进行严格的评审和质量
把关, 这确实加快了软件开发的速度 。 但所产
生的开发率的提高, 远远赶不上对软件产品需
求率的增长 。
? 据统计资料表明, 从 50年代到 80年代的 30年间,
美国的软件生产率翻了两翻 。 但社会对软件的
需求每年以两位数字的百分比在增长 。 软件的
开发, 已成为影响计算机应用的巨大桎梏和瓶
颈 。
第 11 页
(2)软件重用程度很低
?,重用, 也称, 再用, 或, 复用,, 是指同一事物
不经修改或稍加修改就可以多次重复使用 。 显然,
软件重用是节约人力, 提高软件生产率的重要途径 。
? 传统的程序设计方法没能很好地解决软件重用问题 。
建立标准函数库和子程序库是人们为追求提高软件
的可重用性做出的尝试 。 但事实证明, 标准函数库
和子程序库只是对建立在数学模型基础上的应用问
题有可重用的功效, 而对其它应用问题则不行 。
? 对于传统的 SA-SD-SP技术而言, 思维成果的可重用
性很差 。
第 12 页
(3)软件维护困难
? 按生命周期方法学开发出的软件, 维护成本很
高, 据统计数据表明, 软件维护的生产率比软
件开发的生产率低几十倍 。
? 80年代, 美国一年花费的软件维护费用高达
300多亿美元 。
? 90年代, 软件维护费用占系统研制, 开发总费
用的 70%-80%。
第 13 页
(4)软件不能真正满足用 户的需要
? 实践表明, 用传统方法开发的大型应用系统往往不能
真正满足用户的需要 。 在美国, 开发出的系统中:
?符合用户需要并顺利投入使用的系统仅占总数
的 1/4;
?中途夭折的系统占 1/4;
?将近 1/2的系统, 虽然完成了开发过程, 但并未
被用户采用或并未被长期使用 。
? 还表现在:
?开发人员不能完全获得或不能彻底理解用户的要求,
以致开发出的软件系统与用户预期的系统不一致,
不能满足用户的需要 。
?所开发出的系统不能适应用户经常变化的情况, 系
统的稳定性和可扩充性不能满足要求 。
第 14 页
现实世界与 OO系统的对应关系
? OO方法是将现实世界抽象为, 对象是什么?,, 所以说, OO方法
是更高一级的抽象 。 它和人认识现实世界的方法是一致的 。
现实问题空间 面向对象解空间
物质:
一辆白色的自行车
意识:
自行车
具体事物:
一个对象 ——自行车的实例
抽象概念:
自行车类
?现实世界中事物分为两大部分:物质和意识;前者表示是具体的事
物,后者描述的是某个抽象的概念。
?现实世界中,“一辆白色自行车”是客观存在,是物质的;而自 行
车是人脑中一个抽象的概念,是主观意识;
?在 OO系统中自行车用“自行车类”来表达,“一辆白色自行车”
是一个具体的对象,是自行车类的一个实例。
第 15 页
4.OO方法及其 4个要点
? ( 1) 概念, LOO方法是基于对象, 类, 继承, 消息机制,
多态等技术特征的构造系统的软件开发方法 。
? ( 2) 客观世界由各种对象组成 。 OO的软件系统也是由对象
组成的;任何复杂的软件都是由简单的对象组合而成的;
? ( 3) 所有对象都可以划分为不同的对象类 ;每个对象类都
有自己特定的数据和方法;
? ( 4) 对象类具有层次结构 ;上层的类称为, 父类, 或, 基
类,, 下层的类称为, 子类, 或, 派生类, 。 子类可以继
承父类的特性及操作;
? ( 5) 对象之间通过传递, 消息, 互相联系 ( 消息机制 ) 。
OO方法 = 对象 + 类 + 继承性 + 消息机制
第 16 页
5.OO方法的主要优点
? (1)与人类习惯的思维方法一致
? (2)稳定性好
? (3)可重用性好
? (4)可维护性好
第 17 页
(1)与人类习惯的思维方法一致
? 人的认识过程是从一般到特殊的渐进思维过
程, 是从, 是什么?, 开始, 认识事物及其
本质规律, 主观随意性受到限制 。
? 而传统方法是从, 怎样做?, 开始, 到, 做
什么?,, 反认识规律而动, 主观随意性太
多 。
第 18 页
(2)稳定性好
? 传统方法以, 过程为中心,, 完全基于功能分
析和功能分解 。 当功能需求发生变化时, 将引
起对软件结构整体的修改, 这样的系统是不稳
定的 。
? OO方法以, 对象为中心,, 它是以对象模拟问
题领域中的实体, 以对象间的联系描述实体间
的联系 。 在分析, 研究对象及其属性的过程中
根据其内在的规律建立求解模型 。 基于这种方
法建立的软件系统, 不管功能需求如何变化,
其内在规律不变, 因而不会引起软件系统结构
的整体变化 。 因此是稳定的 。
第 19 页
(3)可重用性好
? OO方法采用封装机制和信息隐藏机制, 使其
内部实现与外界完全隔离, 具有较强的独立
性 ( 对象对外界而言, 好象一个, 黑匣子
,) 。 较好地解决了, 软件复杂性控制, 问
题 。
? OO方法中类的继承性是一种代码重用的有效
途径 。 开发者在设计软件的过程中, 将一些
精心设计, 测试过的代码不断加入到已有的
类库中 。 而类库是可供共享的代码库 。
? 因此用 OOP开发的软件具有较好的可重用性 。
第 20 页
(4)可维护性好
? 稳定性较好 局部修改, 不影响大局,
错误不会传播;
? 易修改 封装性和信息隐藏机制
? 易于阅读, 理解 符合人类习惯的思维
方法, 对原系统所做的修改, 往往通过在
原有类的基础上派生一些新类即可实现,
易于贯通 。
? 易于测试和调试 派生类继承原有类的
特性, 只需测试新增加的特性即可 。
第 21 页
6.面向对象程序设计语言 OOPL
? OOPL有两个显著的特征,
? 抽象数据类型 (ADT)
? 继承性
? OOPL要提供:
? 特定的语法成分来保证和支持 OOP;形式上
要能够表现,语义上要能够处理;
? 继承性, 多态性和动态链接机制, 使得类
和类库成为可重用的程序模块 。
第 22 页
面向对象程序设计语言的发展史
? LISP语言 50年代末发展起来的一种符号处理语言, 是一
种人工智能语言 。 1979年推出 Flavors是 LISP的 OOPL版本 。
? Simula语言 60年代开发, 在 ALGOL60的基础上扩充 。 主
要用于模拟 。 具有表加工等功能 。
? SmallTalk语言 第 1个真正的 OOPL,它体现了纯粹 OOP设
计思想 。 它起源于 Simula,是最成功的一个版本 。
? C家族 C++是在 C基础上扩充, 增加了对象处理机制, 将
,类, 看作是用户定义类型 。 由于 C++的出现, 才使 OOPL
越来越得到重视和广泛的应用 。 C++有许多种类,MS C++、
Turbo C++,Borland C++ 和 Visual C++等 。
? 其它语言 的 OO版本有,Turbo PASCAL,Object PASCAL、
Visual Basic等 。
第 23 页
7.实体和对象
? 实体 客观存在的事物 。 客观世界中的问
题都是由实体及其相互之间的关系构成的 。
? 对象 客观世界中的 实体 均可以抽象为问
题空间中的 对象 。 可以将要研究的任何事
物作为对象;大到航天飞机, 宇宙天体,
工厂, 学校, 小到一个学生, 一本书 。 对
象可以是 具体实体, 还可以表示 抽象实体,
例如规则, 算法, 事件等 。
第 24 页
( 1)对象 ——Object( OO中的对象)
? 考虑问题的角度不同, 对对象的定义也不同:
?对象是具有相同状态的一组操作的集合
( 从 OOP的角度看 )
?对象是对属性值和操作的封装
( 从信息模拟的角度看 )
?对象是存储在计算机中的一块私有存储区(具有数据、
也有对数据进行操作的方法) (从存储的角度看) ;
?对象,:={ ID,DS,MS,MI}
ID 标识符 MS 操作集合
DS 数据结构 MI 消息集合 ( 值 )
(形式化定义 )
对象是封装了数据和操作的黑匣子
第 25 页
( 2)对象的三个特征
? 标识 用来区别其它对象;
? 状态 用来描述对象的属性, 用数据成员来表示;
? 行为 对对象的操作, 用于改变对象的状态;
行为分两类:
?自身所承受的操作
?施加于其它对象的操作
? 例如, 一个人叫王东, 男, 1.80M,68kg,会修电器,可教计算
机课 。 描述如下:
对 象 名, 王东
对象状态, 性别:男 身高,1.80m 体重,68kg
对象功能,
回答身高, 体重, 性别 ( 属于自身所承受的操作 )
修理电器, 教计算机课程 ( 属于施加于其它对象的操作 )
第 26 页
? 可以把对象看成是一个封装了数据和操作的黑匣子
( 实体 ) 。
数据描述了对象的状态
属性表示对象的结构特征
操作可以改变对象的状态
通过传递消息实现对象的操作
第 27 页
自动机模拟对象举例
? 对象中的数据表
示对象的状态,
一个状态只能由
该对象的操作来
改变 。 每当需要
改变对象的状态
时, 只能由其它
对象向该对象发
出消息 。 对象响
应消息时, 按照
消息模式找出与
之匹配的方法,
并执行该操作 。
状态
S
输出
fi(x,s)
输入
fi,x
操作, f1,f2,…,fn
转换,g1,g2,…,gn
转换, 新状态 S’=gi (x,s)
第 28 页
( 3)对象的特点
? 以数据为中心 所设操作都与数据要做的处理有关 。
? 对象是主动的 与传统的数据有本质不同, 不是被动
地等待对它进行处理;相反, 对象本身是进行处理的
主体 。
? 实现了数据封装 对象的私有数据完全被封装在内部,
对外是不可见的 。 要使用对象的私有数据, 只需知道
数据的取值范围和可以对该数据施加的操作, 根本无
须知道数据的具体结构以及实现操作的算法 。 这就是
抽象数据类型 ( ADT) 的概念 。
? 本质上具有并行性 不同对象各自独立地处理自身的
数据, 彼此通过发消息传递信息完成通信 。
? 模块独立性好 对象的内聚性强, 对象间的耦合性弱 。
第 29 页
8.类 ——Class
? (1)类的概念
? 人们习惯于把有相似特征的事物归为一类, 分类是人
类认识客观世界的基本方法 。
? 在 OO方法中,, 类, 就是对具有相同数据和操作的一
组相似对象 。
? 例如,, 人, 类, 可以是黑人, 白人, 可以是教师,
工人等, 他们具有相同的人类特征和行为特征 。
? 类是 OO技术中最重要的概念 。 OOP中所有的操作都可
归结为对类的操作 。
? 类形成了一个具有特定功能的模块和一种代码共享的
手段 。 它为程序员提供了一种工具, 使得可方便地建
立所需要的任何类型 。
第 30 页
C++中对象类的定义举例
CLASS person {
Private,&& 私有数据和操作
char name[20];
int age;
cahr address[40];
char sex[10];
void PrintName( );
viod PrintAge( );
void PrintAddress( );
void PrintSex( );
Public,&& 公有操作
void Print( ) {
PrintName( );
PrintAge( );
PrintAddress( );
PrintSex( ); }
};
结构特征
数据成员
行为特征
成员函数
第 31 页
( 2)类层次
? 对象类描述的问题可以是一个点,也可以是一个方面 。 类的
层次结构称为类层次 。 处于上层的称为, 父类, 或, 基
类,, 处于下层的称为, 子类, 或, 派生类, 。
? 例如,, 人, 类是一个类层次;
工人, 农民, 学生, 教师是
,人, 类的派生类;
中学生, 大学生,
研究生是, 学生,
类的派生类, 研究
生, 助教, 讲师,
教授是, 教师, 类
的派生类 。
工人
人
中学生
教师 农民学生
大学生 研究生 助教 讲师 教授
父类
派生类
第 32 页
( 3)类格结构
? 将子类具有一个以上
父类的类层次结构称
为 类格结构 。
? 例如,
研究生子类;有在职
研究生, 他们在读学位
的同时, 还要承担教学
任务 。 类格结构用来描述具有多重隶属关系 ( 多重属
性 ) 的对象类 。
教师学生
研究生
第 33 页
9.实例 ——Instance
? 组成类的对象, 都是该类的实例 。
? 类与实例之间的关系, 可以看成是抽象与具体的关系 。
类是多实例的综合抽象, 而实例又是类的个体实物 。
? 例如,, 书, 是一个对象类, 而, 软件工程导论, 则
是, 书, 类的一个实例 。
? 实际上类是建立对象时使用的样板, 按照这个样板所
建立的一个个具体的对象, 就是类的实例例子 。
第 34 页
10.消息 ——Message
? 前面举例中人的对象 ——王东 。 他可以修理电器, 讲计
算机课;这是他为别人可提供的服务 。 他还接受其它对
象的服务, 例如吃饭, 穿衣等 。 他要请求别人解决这些
问题 ( 因为他不生产粮食和服装 ) 。 这里的, 请求, 就
是人与人之间进行交互的手段 。 同样, 它什么时候修理
电器, 什么时候讲课, 都要得到其他对象的请求后才进
行 。
? 在面向对象的技术中,, 请求, 就是发送的, 消息, 。
消息是对象之间相互请求或相互协作的途径, 是要求某
个对象执行其中某个功能操作的规格的说明 。
? 发送消息的对象称为 发送者, 接收消息的对象称为 接收
者 。 对象间的联系, 只能通过传递消息来进行 。 对象也
只能在收到消息时, 才被激活 。 被激活后的对象代码将
按消息中的命令去操作它的私有数据, 完成要求的功能 。
第 35 页
( 1)消息的定义
? 将操作送到目标对象的一种机制称为消息 。 它
包括操作名的选择和传递, 操作信息的变量有
三个部分:
?接收消息的对象
?消息选择符
?变元
? 例如, 增加公司的操作,JFM( 一汽集团公司 )
JFM,Add子公司 ( ?奥迪 1000? )
操作变量 操作名 目标对象
“Add子公司”操作 将‘奥迪 1000’加入到 JFM中,当 JFM
接到该消息后,就执行,Add子公司”的操作。
第 36 页
( 2)消息的性质
? 同一对象可接收不同形式的多个消息, 产生不
同的响应;即
1个对象 M个消息 M个动作
? 相同形式的消息可以送给不同的对象, 所做出
的响应可以是截然不同的;即
M个对象 1个消息 M个动作
? 消息的发送可以不考虑具体的接收者, 对象可
以响应消息, 也可以对消息不予理会, 对消息
的响应并不是必须的 。
第 37 页
( 3)消息类型
? 公有消息 在某个对象的一批消息中, 由外界
对象直接向它发送的消息, 称为公有消息 。
? 私有消息 在某个对象的一批消息中, 不对外
发放, 由对象自己向本身发送的消息, 称为私
有消息 。
? 前面介绍的对象类 person中, print( )是公有
消息,其它 (PrintName(),PrintAge()等 )为私
有消息 。 外 界对 象 只 能 向 person对象 发 送
print()消息 。
? 另外还有
? 可返回对象的内部状态的消息;
? 可改变对象的内部状态的消息;
? 可以做一些特定的操作, 改变系统状态的消息 。
第 38 页
消息序列
? 即接收或发送一系列的消息 。 在 OO系统中就是用消息序列来表述要解决的一
系列问题的 。 例如, 定义类 person和类 course如下:
Class person { class course {
char Name[20]; char Cname[20];
int Age; int roomno;
char Major[20]; char Ctime[20];
int Score;
public,public:
void print() {cout <<Name<<Age<< //……..
Major<<Score;} void print() { cout<<Cname<<
void printName(){cout<<Name;} roomno<<Ctime;}
void printAge(){cout<<Age;} };
void printMajor(){cout<<Major;}
void printScore(){cout<<Score;}
};
void f1(person P) void f2(person P,course C)
{ P.printName(); { P.print();
P.printAge(); C.print();
P.printMajor(); }
P.printScore(); 函数 f1向 person类对象 P发送了 4个打印消息 ;
} 函数 f2向 person类对象 P和 course类对象 C各发 1个消息,
第 39 页
11.事件( Event)
? 在自然界中,各种动物都能够对刺激作出反应。在程序
设计中,对象只有具有相同的反应能力,才能实现要求
的功能。对象对外界的刺激能够作出反应就是用 事件 和
方法 来模拟和实现的。
? 当用户对某一对象有操作意图的时候,通过外部设备
(鼠标、键盘等)输入必要的信息,计算机不但能够判
断出事件的性质,而且能够判断出事件的特征,从而给
对象一个准确的刺激,使对象进行预定的反应行为。
? 刺激对象的方式很多;例如,单击鼠标左键,计算机将
接收到一组信号,确定鼠标单击事件的发生,而事件的
特征,包括鼠标的位置、鼠标的激活键等信息也同时被
计算机接收,与对象联系起来,于是启动对象中对的事
件处理程序,进行事件的处理。
第 40 页
12.方法( Method)
? 对对象的处理称为 方法 或 操作 。 它包括控
制和操作过程 。
? 方法描述了对象执行操作的算法, 响应消
息的方法,
? 在 C++中称为 成员函数 。
? 例如:
ADD子公司 ( )
Print( )
第 41 页
13.属性( Attribute)
? 对象中的数据称为 属性, 它是对实体
所具有的性质大抽象 。
? C++中把属性称之为 数据成员 。
? 例如:
char name[20];
int age;
第 42 页
二、面向对象方法的特点
? OO方法的抽象技术
? OO方法的封装技术
? OO方法的继承机制
? 多态
? 消息机制
第 43 页
1.OO方法的抽象技术( Abstraction)
? 抽象是指将实际问题化简为计算机能处理和表示的形式 。
? OO方法比其它已有方法从应用设计到解决方案有更高的抽象性和
更好的对应性 。
? 主要原因是 (抽象技术的特征 ):
? 对象具有极强的抽象表达能力 OO方法采用对象来表达一切事
物 。 由于对象具有不同的属性, 使得 OO方法具有很强的建模能
力 。
? 对象实现了抽象的数据类型 在对象抽象的基础上, OO方法更
进一步提出对象类的概念, 从而实现了更高层的抽象 。 用户可
以根据实际问题的需要, 自定义对象类的机制被称为, 抽象的
数据类型,, 它使 OO方法具有更强的解决复杂问题的能力 。
? 规范化的抽象方法 OO方法的抽象技术更加接近于人类认识客
观事物的思维方法 。 寻找要求解的对象实体, 研究其属性和功
能, 再根据实体的性质, 功能将它们组成不同的功能模块 。
第 44 页
2.OO方法的封装技术( Encapsulation)
? 在程序设计中, 封装是指将数据及与这些数据有关的操
作集合放在一起, 形成一个能动的实体 ——对象 ( 黑匣
子 ) 。
? 用户不必知道对象行为的实现细节, 只要根据对象提供
的外部特征及接口来访问对象 。
? 所谓, 封装性, 是一种信息隐藏技术, 其目的是将对象
的设计者和对象的使用者分开 。
? 对象的封装性体现在:
?具有清楚的边界 对象的数据结构和操作限定于其中
?具有统一的外部接口 ( 也称消息模式 ) 它描述了对
象之间的相互作用, 请求和响应
?代码保护 对象内部的实现代码受到封装壳的保护,
其它对象不能直接修改本对象所拥有的数据和代码 。
第 45 页
封装机制的目的
? 将对象的使用者和设计者分开 ;使用者
不必知道对象行为实现的细节, 只需用
设计者提供的协议 ( 消息 ) 命令对象去
实现其动作 。
? 协议 ( Protocol) 是一个对象对外服务
的说明, 它声明对象可以为外界做什么 。
请求对象进行操作的唯一途径就是通过
协议中提供的消息进行的 。 协议实际上
是一个对象所能接受的所有公有消息的
集合 。
第 46 页
STUDENT对象类举例
class student {
private,私有功能,changemark只供
char *name; 对象自己使用
int mark;
char *major ; void changemark( ) ;
public, 公有功能,getname和
char *getname( ) ; getmajor可供外界
char *getmajor( ), 对象使用
protected:
int getmark( ) ; 被保护功能,getmark,虽向外
}; 界公布, 但只能
由为排生类对象提
供服务 。
第 47 页
3.OO方法的继承机制 (Inheritance)
? 继承所表达的是一种对象类之间的相互关系,它使
得某类对象可以继承另一类对象的特征和能力 。
? 继承性的含义是:自动共享类的对象的全部特征的
一种机制 。 它包括:
?继承性 新的对象自动继承该类的特征;
?继承传递性 子类自动继承其父类的特征;对多
层类结构, 下层子类可以继承其上各层父类的
特征;
?多重继承性 子类可以从它的多个父类 ( 超类 )
中继承它们的特征 。
第 48 页
继承性举例
? 在, 人, 类中, 大学生可以继承, 人, 和, 学生,
的特征 ( 继承传递 ) ;对于在职研究生既可以继承
,学生, 的特征, 又可以继承, 教师, 的特征 ( 多
重继承 ) 。
人
身份证号:
姓名:
学号:
校名
学生
大学生
专业:
班级:
身份证号,xxxxxxx
姓名:刘小明
学生,学生,9601078校名:西安交通大学
大学生,专业:计算机班级,962班
人:
第 49 页
具有继承关系的对象的特性
? 对象类间具有共享特征 ( 包括数据和程序代
码的共享 )
? 对象类间具有细微的差别或新增部分 ( 包括
非共享的程序代码和数据 )
? 对象类间具有层次结构 。
? 继承所具有的作用有两个方面:
?减少代码冗余
?通过协调性减少相互之间的接口和界面 。
第 50 页
继承的分类
? 从继承源上划分为:单继承和多继承
?单继承 一个人只能继承一个人的财产
?多继承 一个人既可以继承父母的财产,又可以继承其
他亲属的财产。
? 从继承内容上划分为:取代, 包含, 受限和特化继承 。
?取代继承 徒弟掌握了师傅所有的技术, 在任何需要师
傅的地方都可以由徒弟来代替;
?包含继承, 水果, 是一类对象,, 苹果, 是一种特殊
的水果 。, 苹果, 继承了, 水果, 的所有特征;任何一
个苹果都是一个水果, 即苹果包含了水果具有的所有特
征;
?受限继承, 驼鸟, 是一种特殊的鸟, 它不能继承鸟会
飞的特征;
?特化继承, 工程师, 是一类特殊的人, 他们比一般人
具有更多的特有信息 。
第 51 页
继承性的优点
? 能清晰体现相关类间的层次结构关系;
? 可大大增加代码的重用性;
? 通过增强一致性来减少模块见的接口和
界面, 大大增加可维护性;
? 是自动传播代码的有利工具
? 在一般类基础上构造, 建立, 扩充新类
的最有效的手段 。
第 52 页
作业、思考题
? 思考:
第 11章的 1.~9.
? 预祝同学们考出好成绩。
谢谢!再见!