面向对象程序设计的基本知识.pptx
第第1章章 面向对象程序设计基本知识面向对象程序设计基本知识1.1 面向对象思想的由来面向对象思想的由来1.2 面向对象的基本概念面向对象的基本概念1.3 面向对象程序设计的特性面向对象程序设计的特性1.4 面向对象的程序设计语言面向对象的程序设计语言思考与练习第1页/共60页1.1 面向对象思想的由来面向对象思想的由来1.1.1结构化程序设计编程引例结构化程序设计编程引例 有如下编程问题:请计算出1999年5月10日到2006年3月8日期间一共有多少天?如何用如何用C C语言实现?语言实现?第2页/共60页1.1 面向对象思想的由来面向对象思想的由来1.1.1结构化程序设计编程引例结构化程序设计编程引例 算法描述如下:算法描述如下:(1)计算从1999 到2006 期间所有整年共有多少天;(2)计算从1999 年5 月10 日到年底(即12 月31 日)共有多少天;(3)计算从2006 年元旦到2006 年3 月8 日期间一共有多少天。第3页/共60页1.1 面向对象思想的由来面向对象思想的由来1.1.1结构化程序设计编程引例结构化程序设计编程引例 数据结构表示如下:数据结构表示如下:/封装日期信息public struct MyDatepublic int Year;/年public int Month;/月public int Day;/日第4页/共60页1.1 面向对象思想的由来面向对象思想的由来1.1.1结构化程序设计编程引例结构化程序设计编程引例 程序设计如下:程序设计如下:/计算两个日期之间的所有天数static int CalculateDaysOfTwoDate(MyDate beginDate,MyDate endDate)/第5页/共60页1.1 面向对象思想的由来面向对象思想的由来1.1.1结构化程序设计编程引例结构化程序设计编程引例 程序设计如下:程序设计如下:/计算两个日期之间的所有整年天数,不足一年的去掉static int CalculateDaysOfTwoYear(int beginYear,int endYear)/第6页/共60页1.1 面向对象思想的由来面向对象思想的由来1.1.1结构化程序设计编程引例结构化程序设计编程引例 程序设计如下:程序设计如下:/计算两个日期之间不足整年的天数static int CalculateDaysOfTwoMonth(MyDate beginDate,MyDate endDate)/第7页/共60页1.1 面向对象思想的由来面向对象思想的由来1.1.1结构化程序设计编程引例结构化程序设计编程引例 程序设计如下:程序设计如下:/根据年数判断其是否为闰年static bool IsLeapYear(int year)/第8页/共60页1.1 面向对象思想的由来面向对象思想的由来1.1.1结构化程序设计编程引例结构化程序设计编程引例 程序设计如下:程序设计如下:第9页/共60页1.1 面向对象思想的由来面向对象思想的由来1.1.1结构化程序设计编程引例结构化程序设计编程引例 程序代码如下:程序代码如下:MyDate d1,d2;/起始日期和结束日期/1999年5月10日d1.Year=1999;d1.Month=5;d1.Day=10;/2006年3月8日d2.Year=2006;d2.Month=3;d2.Day=8;/计算结果int days=CalculateDaysOfTwoDate(d1,d2);第10页/共60页1.1 面向对象思想的由来面向对象思想的由来1.1.1结构化程序设计编程引例结构化程序设计编程引例 小结:传统的结构化程序设计思想是以解决问题小结:传统的结构化程序设计思想是以解决问题的过程作为出发点,把程序定义为的过程作为出发点,把程序定义为“数据结构数据结构+算法算法”,采取自顶向下、逐步求精的,采取自顶向下、逐步求精的功能分解功能分解法,法,将整个程序结构划分成若干个功能上相对独立的将整个程序结构划分成若干个功能上相对独立的模块,每个模块都由逻辑上或功能上相关的若干模块,每个模块都由逻辑上或功能上相关的若干个函数构成,从而把一个大问题分解成若干个子个函数构成,从而把一个大问题分解成若干个子问题,每个子问题又被分解成更小的子问题,直问题,每个子问题又被分解成更小的子问题,直到得到的子问题可以用一个函数来实现为止。到得到的子问题可以用一个函数来实现为止。编编程的基本单位是函数程的基本单位是函数,每个函数都完成整个程序,每个函数都完成整个程序的一个功能。的一个功能。第11页/共60页1.1 面向对象思想的由来面向对象思想的由来1.1.2 面向对象的思想面向对象的思想 随着计算机技术的发展,人们越来越希望能有随着计算机技术的发展,人们越来越希望能有一种通过与计算机进行一种通过与计算机进行直接交互直接交互而反映人类解决而反映人类解决问题的问题的自然方法自然方法,传统的程序设计思想需要专门,传统的程序设计思想需要专门学习和长时间训练才能实现,显然无法满足这一学习和长时间训练才能实现,显然无法满足这一要求。要求。“面向对象面向对象”是软件程序设计中的一种新思想,是软件程序设计中的一种新思想,它通过模拟人的思维方式,尽量实现将现实世界它通过模拟人的思维方式,尽量实现将现实世界中的事物直接映射到软件系统,使软件系统对现中的事物直接映射到软件系统,使软件系统对现实世界的直接模拟,从而使程序设计更加贴近现实世界的直接模拟,从而使程序设计更加贴近现实并且花费更小的精力。实并且花费更小的精力。第12页/共60页1.1 面向对象思想的由来面向对象思想的由来1.1.2面向对象的思想面向对象的思想 面向对象技术是计算机应用领域发展起来的新面向对象技术是计算机应用领域发展起来的新生事物,它吸取了结构化程序设计中最为精华的生事物,它吸取了结构化程序设计中最为精华的部分,被认为是程序设计方法学方面的一场革命。部分,被认为是程序设计方法学方面的一场革命。返回返回第13页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.1对象、消息和类对象、消息和类1.对象对象 现现实实世世界界中中的的对对象象是是我我们们认认识识世世界界的的基基本本单单元元,如如一一个个人人、一一辆辆车车、一一次次购购物物、一一次次演演出出等等。对对象象可可以以简简单单也也可可以以复复杂杂,复复杂杂对对象象一一般般由由若若干干个个简简单单对对象象组组成成。作作为为现现实实世世界界中中的的实实体体,对对象象具具有以下特性:有以下特性:有一个用于与其它对象相区别的名字有一个用于与其它对象相区别的名字具有某些属性或状态特征具有某些属性或状态特征有一组操作,每个操作决定对象的一种行为有一组操作,每个操作决定对象的一种行为对象之间以消息传递的方式相互通信对象之间以消息传递的方式相互通信第14页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.1对象、消息和类对象、消息和类1.对象对象 面面向向对对象象中中的的对对象象是是由由描描述述自自身身状状态态特特征征(属属性性)的的数数据据及及定定义义在在该该数数据据上上可可对对这这些些状状态态施施加加的的一一组组操操作作组组成成的的实实体体,是是数数据据单单元元和和过过程程单单元元的集合体。的集合体。第15页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.1对象、消息和类对象、消息和类1.对象对象 在在计计算算机机中中,对对象象可可看看成成是是存存储储器器中中一一个个可可标标识识的的区区域域,是是一一个个数数值值的的集集合合。在在面面向向对对象象程程序序设设计计中中,对对象象用用一一个个运运行行中中的的存存储储单单元元来来存存放放,其其状状态态用用属属性性的的值值来来表表征征,可可以以是是初初等等数数据据类类型型(整整型型、实实型型、字字符符型型等等),也也可可以以是是用用户户自自定定义义的的数数据据类类型型(结结构构、枚枚举举等等),还还可可以以是是对对象象(如如“人人”这这个个对对象象,其其状状态态属属性性“家家庭庭成成员员”可能是另一个对象)。可能是另一个对象)。第16页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.1对象、消息和类对象、消息和类1.对象对象 对对象象作作为为构构成成和和支支撑撑整整个个面面向向对对象象程程序序设设计计最最重重要要的的细细胞胞和和基基石石,具具有有模模块块独独立立性性(一一个个对对象象是是一一个个独独立立存存在在的的模模块块)、动动态态连连接接性性(通通过过消消息息激激活活机机制制使使对对象象之之间间动动态态联联系系)和和易易维维护护性性(对对象象的的功功能能和和实实现现细细节节局局限限于于模模块块内内部部)三三个个特征。特征。现现实实世世界界中中一一切切事事物物都都是是对对象象,在在解解决决实实际际问问题题时时,首首先先要要分分析析对对象象,这这直直接接影影响响到到面面向向对对象象程序设计的质量。程序设计的质量。第17页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.1对象、消息和类对象、消息和类2.消息消息 现现实实世世界界中中的的对对象象存存在在着着各各种种各各样样的的联联系系,同同样样,面面向向对对象象程程序序设设计计中中的的对对象象之之间间也也存存在在着着联联系系,它它们们是是通通过过消消息息传传递递来来进进行行的的,对对象象只只有有在在收收到到消消息息时时才才被被激激活活,被被激激活活后后的的对对象象才才能能按按照照要求操作相关数据完成消息的传送。要求操作相关数据完成消息的传送。第18页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.1对象、消息和类对象、消息和类2.消息消息 例例如如学学生生对对象象请请求求教教师师对对象象辅辅导导,学学生生对对象象向向教教师师对对象象发发出出消消息息,教教师师对对象象接接收收到到这这个个消消息息后后才决定做什么辅导并执行辅导。才决定做什么辅导并执行辅导。所以说:所以说:消消息息是是对对象象之之间间相相互互请请求求或或相相互互协协作作的的途途径径,是是要要求求某某个个对对象象执执行行其其中中某某个个功功能能操操作作的的规规格格说说明明。第19页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.1对象、消息和类对象、消息和类2.消息消息消息具有如下性质:消息具有如下性质:(1)同同一一对对象象可可以以接接受受不不同同形形式式的的多多个个消消息息并并做做出出不同的响应;不同的响应;(2)相相同同形形式式的的消消息息可可以以传传递递给给不不同同的的对对象象,做做出出的响应可以是不同的;的响应可以是不同的;(3)消消息息的的发发送送可可以以不不考考虑虑具具体体的的接接受受者者,对对象象可可以相应,也可以不响应。以相应,也可以不响应。第20页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.1对象、消息和类对象、消息和类2.消息消息 在在面面向向对对象象程程序序设设计计中中,消消息息分分为为公公有有消消息息和和私私有有消消息息两两类类。若若有有一一批批消消息息同同属属于于一一个个对对象象,则则其其中中由由外外界界对对象象直直接接向向其其发发送送的的部部分分称称为为公公有有消息消息,由它,由它自己向本身发送自己向本身发送的部分称为的部分称为私有消息私有消息。如如在在下下面面的的人人员员对对象象类类中中,消消息息print()为为公公有有消消息息,而而printName()、printage()、printadd()、printsex()为私有消息。为私有消息。第21页/共60页第22页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.1对象、消息和类对象、消息和类3.类类 类类是是一一组组客客观观对对象象的的抽抽象象表表示示,它它将将该该组组对对象象所所共共同同具具有有的的结结构构特特征征(即即状状态态属属性性)和和行行为为特特征征(即即操操作作)集集中中起起来来加加以以描描述述和和说说明明,以以表表明明该组对象的性质和能力。该组对象的性质和能力。类类和和对对象象是是抽抽象象和和具具体体的的关关系系,组组成成类类的的所所有有对对象象均均为为该该类类的的实实例例,因因此此,类类是是多多个个实实例例的的综综合抽象,实例是类的个体实物合抽象,实例是类的个体实物。第23页/共60页第24页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.1对象、消息和类对象、消息和类3.类类 类类没没有有具具体体的的值值,也也没没有有具具体体的的操操作作。当当给给类类中中的的属属性性和和行行为为赋赋予予实实际际的的值值以以后后,就就得得到到了了类类的的一一个个对对象象。在在面面向向对对象象程程序序设设计计中中,类类是是避避免免重重复复编编码码的的有有效效手手段段,它它只只出出现现在在源源程程序序代代码码中中,不不会会出出现现在在正正在在内内存存运运行行的的程程序序中中。换换句句话话说说,类类只只在在编编译译时时存存在在,为为对对象象的的创创建建提提供供样样板板,不不占占据据内内存存空空间间。在在内内存存中中运运行行的的是是类类的的对对象象,它它在内存中分配空间并完成计算任务。在内存中分配空间并完成计算任务。第25页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.1对象、消息和类对象、消息和类3.类类 类类是是面面向向对对象象系系统统中中最最重重要要的的概概念念,面面向向对对象象程程序序设设计计中中的的所所有有操操作作都都归归结结为为对对类类的的操操作作,类类形形成成了了一一个个具具有有特特定定功功能能的的模模块块和和一一种种代代码码共共享享的的手手段段以以方方便便地地建建立立和使用所需要的任何类型。和使用所需要的任何类型。返回返回第26页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.2字段、属性、方法和事件字段、属性、方法和事件 类由字段、属性、方法和事件组成。类由字段、属性、方法和事件组成。1.字段和属性字段和属性 字字段段和和属属性性是是指指对对象象所所具具有有的的有有意意义义的的状状态态,表表示示对对象象包包含含的的信信息息,用用以以访访问问对对象象中中包包含含的的数数据。据。字字段段类类似似于于变变量量,主主要要用用于于类类内内直直接接读读取取或或设设置置。例例如如,有有一一个个名名为为“Car”的的对对象象,则则可可在在“Color”字段中存储其颜色。字段中存储其颜色。第27页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.2字段、属性、方法和事件字段、属性、方法和事件1.字段和属性字段和属性 属属性性是是对对字字段段的的简简单单包包装装,主主要要用用于于类类外外的的访访问问,其其读读取取和和设设置置是是通通过过使使用用property Get和和property Set过过程程来来实实现现的的。在在没没有有属属性性语语法法的的语言里,通常是使用对象方法来访问属性。语言里,通常是使用对象方法来访问属性。第28页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.2字段、属性、方法和事件字段、属性、方法和事件2.方法方法 方方法法表表示示对对象象可可执执行行的的操操作作,是是对对象象操操作作过过程程的的算算法法,用用于于访访问问对对象象的的功功能能,通通过过向向类类中中添添加加函函 数数 来来 定定 义义。例例 如如,“Car”对对 象象 可可 以以 有有“StartEngine”、“Drive”和和“Stop”方法。方法。消消息息传传递递的的实实质质是是方方法法的的调调用用,对对象象通通过过调调用用某个方法执行对数据的处理来完成消息的传递。某个方法执行对数据的处理来完成消息的传递。第29页/共60页1.2 面向对象的基本概念面向对象的基本概念1.2.2字段、属性、方法和事件字段、属性、方法和事件3.事件事件 事事件件是是对对象象从从其其它它对对象象或或应应用用程程序序接接收收的的通通知知,或或者者是是对对象象传传输输到到其其它它对对象象或或应应用用程程序序的的通通知知,它它使使对对象象得得以以在在每每当当特特定定情情况况发发生生时时执执行行操操作作。例例 如如,“Car”类类 的的“Check_Engine”事事 件件 等等。对对于于Windows操操作作系系统统来来说说,事事件件可可来来自自其其它它对象、应用程序或用户输入。对象、应用程序或用户输入。返回返回第30页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性1.封装性封装性 所所谓谓封封装装,就就是是把把一一个个事事物物包包装装起起来来,使使外外界界不不了了解解它它内内部部的的具具体体情情况况。在在面面向向对对象象的的程程序序设设计计中中,封封装装是是指指将将相相关关的的数数据据和和代代码码结结合合成成一一个个有有机机整整体体,形形成成数数据据和和操操作作代代码码的的集集合合,对对外外隐隐蔽蔽大大部部分分实实现现细细节节,以以达达到到对对数数据据访访问问权权的的合合理理控制。控制。封封装装使使程程序序中中各各部部分分之之间间的的相相互互联联系系达达到到最最小小,提提高高了了程程序序的的安安全全性性,简简化化了了程程序序代代码码的的编编写写工工作,是面向对象程序设计的重要原则。作,是面向对象程序设计的重要原则。第31页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性1.封装性封装性 面向对象程序设计的封装机制是通过对象来实面向对象程序设计的封装机制是通过对象来实现的。对象中的私有成员是隐蔽的,对象以外的现的。对象中的私有成员是隐蔽的,对象以外的访问被拒绝,而公有成员则提供了对象与外界的访问被拒绝,而公有成员则提供了对象与外界的接口,使外界与对象发生联系。接口,使外界与对象发生联系。接口是把隐式公共接口是把隐式公共方法和属性结合方法和属性结合起来具有特起来具有特定功能的一个集合。例如,可以将较一般用途的定功能的一个集合。例如,可以将较一般用途的属性属性Color和方法和方法Drive()、Stop()组合到一个接组合到一个接口口IVehicle中,然后可以在中,然后可以在Car对象或对象或Bicycle对对象上使用该接口。接口不能单独存在,一个类可象上使用该接口。接口不能单独存在,一个类可以支持多个接口,多个类也可以支持相同的接口。以支持多个接口,多个类也可以支持相同的接口。第32页/共60页第33页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性1.封装性封装性 面面向向对对象象程程序序设设计计的的封封装装性性是是一一种种信信息息隐隐蔽蔽技技术术,它它使使系系统统设设计计员员能能够够清清楚楚地地标标明明他他们们所所提提供供的的服服务务界界面面,用用户户和和应应用用程程序序员员则则只只看看见见对对象象提提供供的的操操作作功功能能,看看不不到到其其中中的的数数据据或或操操作作代代码码细细节节,其其目目的的在在于于将将对对象象的的使使用用者者与与设设计计者者分分开开,这反映了抽象数据类型的思想。这反映了抽象数据类型的思想。第34页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性2.继承性继承性 在在面面向向对对象象的的程程序序设设计计中中,继继承承表表达达的的是是对对象象类类之之间间的的关关系系,它它使使得得一一类类对对象象可可以以继继承承另另外外一一类对象的属性(数据)和行为(操作)。类对象的属性(数据)和行为(操作)。若若类类B继继承承类类A,则则类类B的的对对象象具具有有类类A的的一一切切特特征征,包包括括数数据据和和操操作作。此此时时,类类A称称为为基基类类(也也称称父父类类或或超超类类),类类B称称为为类类A的的派派生生类类(也也称称子子类类)。类类B由由从从类类A继继承承来来的的特特征征和和不不同同于于类类A而新添加的特征两部分组成。而新添加的特征两部分组成。第35页/共60页 若类若类B由类由类A派生而来,而类派生而来,而类C又由类又由类B派生派生而来,则称类而来,则称类A是类是类B的直接基类,是类的直接基类,是类C的间的间接基类。接基类。类类C不但继承了其直接基类的所有特征,还不但继承了其直接基类的所有特征,还继承了其所有间接基类的特征。继承了其所有间接基类的特征。第36页/共60页 (a)(b)图图(a)中,由中,由A、B、C、D和和E组成了一种单继承的派生形式,组成了一种单继承的派生形式,即每个派生类只直接继承了一个基类的特征(如即每个派生类只直接继承了一个基类的特征(如windows操作操作系统中窗口之间的继承关系)。系统中窗口之间的继承关系)。图图(b)中,由中,由A、B、C、D、E和和F形成了一个多继承的类层次,形成了一个多继承的类层次,即派生类中直接继承了不止一个基类的属性(如玩具车类就同时即派生类中直接继承了不止一个基类的属性(如玩具车类就同时继承了玩具类和车类的特征)。继承了玩具类和车类的特征)。第37页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性2.继承性继承性 在在引引入入继继承承机机制制的的面面向向对对象象程程序序设设计计中中,对对象象的的封封装装性性没没有有改改变变,其其操操作作和和数数据据依依然然是是一一个个整整体体,对对象象间间的的通通讯讯只只有有发发送送消消息息一一条条途途径径。但但是是,同同样样是是作作为为代代码码共共享享的的手手段段,继继承承是是一一种种静静态态共共享享代代码码的的手手段段,派派生生类类对对象象被被激激活活后后自自动动共共享享其其基基类类中中的的代代码码,而而封封装装提提供供了了一一种种动动态态代代码码共共享享的的手手段段,属属于于该该类类的的多多个个实实例例在在程程序序运运行行时时共共享享封装的代码。封装的代码。第38页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性2.继承性继承性 委委托托是是面面向向对对象象程程序序设设计计中中经经常常使使用用的的一一种种方方法法,是是将将一一个个对对象象的的工工作作通通过过发发送送消消息息分分配配给给与与该该工工作作相相关关的的特特定定对对象象去去完完成成的的代代码码重重用用机机制制,是相同函数类型的抽象表示。是相同函数类型的抽象表示。第39页/共60页int fun2(int n)int fun3(int n)int m=0;int m=0;for(int k=1;k=n;k+)for(int k=1;k=n;k+)m+=k*k;m+=k*k*k;return m;return m;public delegate int TSum(int n);/声明委托void output(TSum sum)MessageBox.Show(sum(10).ToString();TSum f2=new TSum(fun2);/定义委托变量f2并将其初始化为函数引用TSum f3=new TSum(fun3);/定义委托变量f3并将其初始化为函数引用output(f2);/调用委托引用的函数output(f3);/调用委托引用的函数第40页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性2.继承性继承性 继继承承和和委委托托都都具具有有节节省省代代码码的的作作用用,继继承承定定义义的的类类可可有有继继承承其其它它类类的的能能力力,委委托托则则是是一一个个对对象象可以依赖其它对象为其完成某些操作。可以依赖其它对象为其完成某些操作。继继承承和和委委托托又又是是性性质质不不同同的的两两种种关关系系。继继承承是是在在程程序序描描述述时时建建立立的的静静态态关关系系,基基本本功功能能是是将将功功能能相相关关的的对对象象进进行行特特定定归归类类;委委托托是是既既可可以以静静态态定定义义又又可可以以动动态态定定义义的的复复杂杂关关系系,基基本本功功能能是是将将一一个个对对象象的的工工作作分分配配到到与与之之相相关关的的更更特特殊殊的的对对象象上。上。第41页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性2.继承性继承性 在在面面向向对对象象程程序序设设计计中中,继继承承性性不不仅仅作作用用在在对对操操作作的的继继承承,还还作作用用在在对对数数据据内内容容的的继继承承。继继承承一一方方面面避避免免了了公公用用代代码码的的重重复复,减减少少了了数数据据和和代代码码冗冗余余,提提高高了了软软件件的的复复用用程程度度,另另一一方方面面通通过过协协调调性性增增强强了了类类之之间间的的一一致致性性,减减少少了了相相互互之之间间的的接接口口和和界界面面,保保证证了了软软件件的的质质量量。如如果果没没有有引引入入继继承承,所所有有的的类类就就会会变变为为一一盘盘各各自自为为政政、彼彼此此独独立立的的散散沙沙,每每次次软软件件开开发发就就都都要要从从“一一无无所所有有”开始。开始。第42页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性3.多态性多态性 多多态态性性是是面面向向对对象象程程序序设设计计的的重重要要特特性性之之一一,是是指指不不同同的的对对象象收收到到相相同同的的消消息息时时产产生生不不同同的的操操作作行行为为,它它描描述述的的是是同同一一个个消消息息可可以以根根据据发发送送消消息息对对象象的的不不同同采采用用多多种种不不同同的的动动作作方方式式。简简单单地地说,说,多态性就是一个接口、多种方式多态性就是一个接口、多种方式。在在面面向向对对象象的的程程序序设设计计中中,相相同同名名字字的的函函数数或或运运算算符符在在不不同同的的场场合合可可以以表表现现出出不不同同的的行行为为,这这种编译时的多态性是通过使用重载实现的。种编译时的多态性是通过使用重载实现的。第43页/共60页第44页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性3.多态性多态性 在在面面向向对对象象的的程程序序设设计计中中,一一个个类类等等级级中中相相同同函函数数的的不不同同版版本本也也表表现现出出不不同同的的行行为为,这这种种运运行行时时的的多多态态性性是是通通过过虚虚函函数数来来实实现现的的。具具有有纯纯虚虚函函数的类称为抽象类。数的类称为抽象类。第45页/共60页第46页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性 综上所述,面向对象编程的单位是类,面向对综上所述,面向对象编程的单位是类,面向对象的程序设计象的程序设计至少能解决面向过程的程序设计中至少能解决面向过程的程序设计中以下两个无法解决的问题:以下两个无法解决的问题:(1)数据的封装数据的封装(数据的保护)。在面向过程的(数据的保护)。在面向过程的编程语言中,编程方法无法对全局变量加以控制编程语言中,编程方法无法对全局变量加以控制(如只允许一个函数对全局变量赋值而其它函数(如只允许一个函数对全局变量赋值而其它函数对其进行读取),但在面向对象的编程语言中,对其进行读取),但在面向对象的编程语言中,可以通过数据封装对数据加以保护,只允许被授可以通过数据封装对数据加以保护,只允许被授权者对数据读取或赋值,从而实现对变量的控制;权者对数据读取或赋值,从而实现对变量的控制;第47页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性 (2)复杂程序中程序代码的可重用性复杂程序中程序代码的可重用性。在面。在面向过程的编程语言中,原有程序中的一些现有功向过程的编程语言中,原有程序中的一些现有功能只能简单地从其它程序中复制过来,而在面向能只能简单地从其它程序中复制过来,而在面向对象的编程语言中,新程序通过继承机制就可以对象的编程语言中,新程序通过继承机制就可以从原有程序中继承其现有功能,而且如果新程序从原有程序中继承其现有功能,而且如果新程序需要对继承来的方法重新进行定义、改变或增加需要对继承来的方法重新进行定义、改变或增加新功能,还可以通过多态性来实现;新功能,还可以通过多态性来实现;第48页/共60页1.3 面向对象程序设计的特性面向对象程序设计的特性 除上述问题以外,在面向过程的编程语言中,除上述问题以外,在面向过程的编程语言中,还可能出现类型安全性问题,即数据与程序可能还可能出现类型安全性问题,即数据与程序可能不相容,而面向对象的编程语言可以较好地避免不相容,而面向对象的编程语言可以较好地避免这一问题。这一问题。例例1-1返回返回第49页/共60页1.4 面向对象程序设计语言面向对象程序设计语言 要进行面向对象的程序设计,必须使用面向对要进行面向对象的程序设计,必须使用面向对象的程序设计语言,通过提供继承性、多态性和象的程序设计语言,通过提供继承性、多态性和动态连接机制支持类和类库的使用。动态连接机制支持类和类库的使用。比较有代表性的面向对象程序设计语言有:比较有代表性的面向对象程序设计语言有:(1)Simula。20世纪世纪60年代开发出来的提年代开发出来的提供了类、对象、继承等概念并提出面向对象术语供了类、对象、继承等概念并提出面向对象术语的语言,主要用于建模仿真的语言,主要用于建模仿真Simula67是代表性是代表性版本;版本;(2)Smalltalk。起源于。起源于Simula,是,是20世纪世纪70至至80年代最纯的面向对象程序设计语言,包括年代最纯的面向对象程序设计语言,包括了了Simula的面向对象的所有特征,而且数据封装的面向对象的所有特征,而且数据封装比比Simula更严格。现在一般使用更严格。现在一般使用Smalltalk-80版本;版本;第50页/共60页1.4 面向对象程序设计语言面向对象程序设计语言 (3)C+。在。在C基础上扩充了对面向对象的支基础上扩充了对面向对象的支持,既支持面向过程又支持面向对象,是一种混持,既支持面向过程又支持面向对象,是一种混合型的面向对象程序设计语言。合型的面向对象程序设计语言。(4)C#。C#是是Microsoft 公司在公司在 C+和和 Java 基础上针对基础上针对Microsoft.NET 框架开发的框架开发的一种完全面向对象的编程语言,它不仅可以用于一种完全面向对象的编程语言,它不仅可以用于编写编写Internet或与网络相关的应用程序,还提供或与网络相关的应用程序,还提供了一种编写了一种编写Windows平台上几乎任何类型的软平台上几乎任何类型的软件或组件方式,其语法风格源于件或组件方式,其语法风格源于 C/C+家族,家族,是是 Microsoft 为奠定互联网霸主地位而打造的为奠定互联网霸主地位而打造的 Microsoft.NET 平台的主流语言。平台的主流语言。第51页/共60页1.4 面向对象程序设计语言面向对象程序设计语言1.4.1C+/C#程序结构的特点程序结构的特点(1)至少有一个函数,即主函数)至少有一个函数,即主函数main()或或Main(),C+中可能还有头文件。中可能还有头文件。例例1-2(2)除主函数外,一般还有其它函数(子程序)。)除主函数外,一般还有其它函数(子程序)。例例1-3(3)既考虑函数又考虑数据并将其组成类。类是)既考虑函数又考虑数据并将其组成类。类是基本的编程单位。基本的编程单位。(4)程序由若干个文件组成,每个文件由若干各)程序由若干个文件组成,每个文件由若干各类组成,大部分函数都包含在类中。如某程序由类组成,大部分函数都包含在类中。如某程序由以下以下5个源文件组成,每个源文件又由头文件、数个源文件组成,每个源文件又由头文件、数据和类组成。据和类组成。第52页/共60页文件一test1.cpp/test1.cs文件二test2.cpp/test2.cs文件三test3.cpp/test3.cs文件四test4.cpp/test4.cs文件五test5.cpp/test5.cs全局变量和全局数据类A(包括数个函数体或程序块)class base头文件(C+)类Bclass derive类Cclass grand第53页/共60页1.4 面向对象程序设计语言面向对象程序设计语言1.4.2C#语言的特性与局限性语言的特性与局限性 1.C#语言的特性语言的特性(1)完全支持类和面向对象编程。)完全支持类和面向对象编程。(2)具有定义完整、一致的基本类型集。)具有定义完整、一致的基本类型集。(3)可可 用用 于于 编编 写写 ASP.NET 动动 态态 Web页页 面面 和和XML Web服务。服务。Microsoft在在正正式式场场合合把把C#描描述述为为“一一种种简简单单、现现代代、面面向向对对象象、类类型型非非常常安安全全、派派生生于于C和和C+的编程语言的编程语言”。第54页/共60页1.4 面向对象程序设计语言面向对象程序设计语言1.4.2C#语言的特性与局限性语言的特性与局限性 2.C#语言的局限性语言的局限性(1)不适于编写时间紧迫或性能非常高的代码。)不适于编写时间紧迫或性能非常高的代码。(2)缺乏性能极高的应用程序所需要的关键功能。)缺乏性能极高的应用程序所需要的关键功能。第55页/共60页1.4 面向对象程序设计语言面向对象程序设计语言1.4.3C+/C#程序的实现程序的实现 1.C+程序的实现程序的实现(1)源程序编辑,形成源文件(如)源程序编辑,形成源文件(如test1.cpp)(2)文文件件编编译译,首首先先将将源源文文件件编编译译为为汇汇编编语语言言文文件件(如如test1.asm),再再将将汇汇编编语语言言文文件件编编译译为为目目标文件(如标文件(如test1.obj)(3)目目 标标 文文 件件 连连 接接,形形 成成 可可 执执 行行 文文 件件(如如test1.exe)(4)可可执执行行文文件件调调试试,查查找找可可能能出出现现的的编编译译错错误误、连接错误或算法错误连接错误或算法错误(5)可可执执行行文文件件维维护护,对对投投入入运运行行的的可可执执行行文文件件继续调试、排错继续调试、排错第56页/共60页1.4 面向对象程序设计语言面向对象程序设计语言1.4.3C+/C#程序的实现程序的实现 2.C#程序的实现程序的实现(1)源源 程程 序序 文文 件件 的的 编编 辑辑,形形 成成 源源 文文 件件(如如test1.cs)(2)文文 件件 编编 译译,首首 先先 将将 源源 程程 序序 文文 件件 编编 译译 为为Microsoft的的中中间间语语言言MSIL并并将将其其存存储储在在程程序序集集中中,再再用用JIT(Just-In-Time)编编译译器器将将MSIL编编译译为操作系统特定的本机代码为操作系统特定的本机代码(3)本机代码运行)本机代码运行第57页/共60页返回返回第58页/共60页思考与练习:1.解释以下概念:对象、类、消息、封装、继承、多态 2.什么是面向对象程序设计?它与传统的结构化程序设计有什么不同?3.面向对象程序设计中继承机制的引入是否削弱了类对象的封装性?第59页/共60页感谢您的观看!第60页/共60页