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