2022年第章面向对象程序设计概述 .pdf
《2022年第章面向对象程序设计概述 .pdf》由会员分享,可在线阅读,更多相关《2022年第章面向对象程序设计概述 .pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 / 13 第1章面向对象程序设计概述近年来,面向对象程序设计的思想已经被越来越多的软件设计人员所接受。它是在吸收结构化程序设计的一切优点的基础上发展起来的一种新的程序设计思想。这种新的思想更接近人的思维活动,人们利用这种思想进行程序设计时,可以很大程度地提高编程能力,减少软件维护的开销。面向对象系统最突出的特点是封装性、继承性和多态性。11 什么是面向对象程序设计在软件设计和实现中,传统的被人们广泛使用的方法是面向过程的程序设计方法。在讨论面向对象程序设计之前,我们需要讨论一下面向过程的程序设计。111 面向过程程序设计的基本概念面向过程的程序设计思想的核心是功能的分解:第一步要做的工作就
2、是将问题分解成若干个称为模块的功能块。第二步根据模块功能来设计一系列用于存储数据的数据结构。第三步编写一些过程( 或函数 ) 对这些数据进行操作。显然,这种方法将数据结构和过程作为两个实体来对待,其着重点在过程。设计人员首先考虑如何将功能分解,在每一个过程中又要着重安排程序的操作序列,但同时程序员在编程时又必须时时考虑数据结构,因为毕竟要将操作作用于数据上。数据结构和过程的这种分离,给软件人员造成沉重的负担。例如,我们不可能要求数据结构始终没有变化,且不说在软件维护的时候数据结构有可能发生变化,就是在软件开发的过程中也不能保证数据结构不变化。面向过程的程序设计的缺点之一就是一旦数据结构需要变更
3、的时候,必须修改与之有关的所有模块。因此,面向过程的程序的可重用性差,维护代价高。下面,我们举一个实例来进一步讨论面向过程的程序设计方法。考虑一个银行系统。该系统允许顾客开设不同类型的银行账户,其中包括现金账户、支票账户和贷款账户,同时允许顾客存款、取款和转账。根据面向过程的程序设计方法,首先我们将银行系统分解成三个模块分别负责存款、取款和转账三项工作。这三个过程是MakeDeposit 、 WithDraw 和 Transfer 。接着,建立一个简单的数据结构: struct account char name ; /* 姓名 */ unsigned long accountld; /*账号
4、 * float balance /* 余额 */ float interestYTD * 年利息 * char accountType*账户类型 ( 现金、支票和贷款) * ;然后,对每个过程按照一定的操作顺序编写程序。我们来分析一下,程序员所关心的是否与顾客一致。(1)对于一个顾客来说,他最关心的是账户中还有多少钱,利息是多少,钱存在银行是否安全,而不会对存钱和取钱的程序执行的过程感兴趣。对他而言,只是需要知道存、取精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 13 页2 / 13 款手续,并按照这些手续去做就足够了。(2)程序设
5、计人员所关注的是如何写存、取款的代码,如何在已经建立的数据结构中填写数据并管理它们。可见,程序员与顾客关心的事情是不一致的,这是由于数据结构与“过程”的分离造成的。再进一步分析,顾客与他们的银行账户有没有特殊的关系。在软件系统中,由于顾客只不过是一串字符和数字,因而不用考虑到底是谁拥有该账户,账户里的内容是什么,而银行账号也只不过是一个整数。另外,由于数据结构与“过程”的分离,程序员可以非常方便地修改账目,因为对他来说,只不过是在修改数据结构中的数字,实际上他可能通过修改数据而取走顾客的钱。最后,我们考虑如果数据结构发生了一些变化会产生什么样的结果。对于accountType数据项,原来只有现
6、金账户、支票账户和贷款账户三种取值,程序只能识别这三种取值。由于账户类型的不同,我们在编写存款等过程时,将以不同的操作序列与之对应( 在同一个过程中分情况处理 ) 。对现金账户、支票账户和贷款账户的处理不会完全相同。假设现在需要增加一种账户类型退休账户,后果如何?原来的程序肯定出错。因为在原来的程序中我们只考虑了以上三种账户的情况,对于新增加的账户类型,原来的程序不会处理。也就是说,每增加一种新的账户类型,都必须重新编写程序代码,可见其维护软件的开销是相当大的。上述这些问题的出现都是由于面向过程程序设计的解决方法的着重点在功能,而我们通过分析发现,数据对于客户( 尤其是顾客 ) 似乎更重要。在
7、这里,程序员关心的是如何做(how to do) ,而顾客则关心的是做什么(what t0 do),这是由于过程和数据的分离造成的。使用面向对象的程序设计技术是解决这些问题的最好方法。112 面向对象程序设计的基本概念在面向对象的程序设计中,着重点在那些将要被操作的数据,而不是在实现这些操作的过程。数据构成了软件分解的基础,而不是功能。我们首先要分析顾客在账户( 数据 )中要做什么,然后提供相应的操作,更重要的是不能将数据和相应操作看成两个分离的实体,而是要把它们作为一个完整的实体来对待。数据与定义在它上面的用户需要的操作构成一个整体。同时,数据本身不能被外部程序和过程直接存取。如果想修改银行
8、账户中的数据,惟一的办法是在该数据上提供修改操作,这些修改操作是以用户应得到的利益为根据。当我们把对银行账户的操作定义在数据上,银行账户就是一个类,称为银行账户类。作为其实例,我们可以建立许多具体的银行账户,而每一个具体的银行账户就是银行账户类的一个对象。现在,我们给面向对象程序设计下一个定义。面向对象程序设计是一种新的程序设计范型。面向对象程序的主要结构特点是:第一,程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递息的规律;第二,程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法完成相应的操作。面向对象程序设计的最大优点就是软件具有可
9、重用性。当人们对软件系统的要求有所改变时,并不需要程序员做大量的工作,就能使系统做相应的变化。类与对象是面向对象程序设计中最重要的概念,也是一个难点,想要掌握面向对象程序设计的技术,首先就要很好地理解这两个概念。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 13 页3 / 13 12 对象与类121 对象与类的概念在现实世界中,人们是如何认识“对象”和“类”的。在日常生活中对象就是我们认识世界的基本单元,它可以是人,也可以是物,还可以是一件事。整个世界就是由形形色色的“对象”构成的。例如一辆车、一个球、一个小学生、一次演出。对象既可以
10、很简单,也可以很复杂,复杂的对象可以由若干简单的对象构成。对象 是现实世界中的一个实体,其特性是: (1)每一个对象必须有一个名字以区别于其它对象; (2)用属性 (或叫状态 ) 来描述它的某些特征;(3) 有一组操作,每一个操作决定对象的一种行为。在日常生活中,“类 ”是对一组具有共同的属性特征和行为特征的对象的抽象。例如,由一个个的人构成人类,而一个人是人类的一个实例。类和对象之间的关系是抽象和具体的关系。类是对多个对象进行综合抽象的结果,对象又是类的个体实物,一个对象是类的一个实例。例如,教师黎明和学生李明都是一个对象。对象名:黎明对象名:李明对象的属性:对象的属性:年龄: 30 年龄:
11、 20 学历:博士学历:本科职称:教授性别:男专业:计算机软件专业:计算机科学与技术对象的操作:对象的操作:说自己的年龄打篮球吃饭睡觉授课听课一个个的像黎明这样的教师就构成教师类。一个个的像李明这样的学生就构成学生类。我们前面说过,面向对象程序设计更接近人们的思维。面向对象程序设计中的对象和就来源于现实世界。以面向对象程序设计的观点看,一个对象是由描述其属性的数据和定义在其上面的一组操作组成的实体,是数据单元和过程单元的组合体。类是对一组对象的抽象,这组对象具有相同的属性结构和操作行为,在对象所属的类中要说明这些结构和行为。一个对象是类的一个实例。有了类,才可以创建对象。现在我们给出类的更精确
12、的定义:类是创建对象的样板,它包含对创建对象的状态描述和对操作行为的说明。如果用面向对象的观点来分析银行账户问题,着重点在银行账户上,而不是在存款和取款的行为上,那么,银行账户就是一个类。 class BankAccount public:void MakeDeposit(float amount); float WithDraw(float amount);bool Transfer(BankAccount&to,float amount);精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 13 页4 / 13 private: flo
13、at balance;float interestYTD; char*owner;int account_number; );在 BankAccount 类中,说明的行为是MakeDeposit 、WithDraw 和 Transfer 。这些行为对于任何客户来说是很重要的,他们在银行开户的目的就是要进行存款、取款以及转账。正因为每一个顾客( 作为类的实例) 都可能做这些操作,所以对行为的说明是public ,即公有的 。 同 时 , 在 BankAecount类 中 , 还 说 明 了 数 据balance 、 interestYTD、 owner和account number,这些数据是私
14、有的,只能在被定义的类中进行操作。作为银行账户类的实例,银行的每一个银行账户都是一个对象。每个银行账户对象有相同的结构和行为。因此,任何一个银行账户对象都可以使用在类中说明的MakeDeposit 等操作,而且每个银行账户对象有相同类型的数据结构balance 等。在面向对象程序设计中,一个类只在源程序的代码中出现,而并不会在一个正在内存运行的程序中出现,即类只是在编译时存在;对象作为类的实例在运行的程序中出现,并占有内存空间,它是在运行时存在的实体。所以一个类实际上是一种新的数据类型,当我们要用一个新的数据类型时,首先要在源程序中说明,而说明部分的代码是不在内存中运行的。在程序中运行的是该类
15、的对象,对象在内存完成。注 意, 我们 在此 必须 严格 区分 说明 和定 义。 前面 我们 用C+写 的程 序段 是对 类BankAccount的说明。在c+的类中,我们把那些行为称为成员函数 ,而把数据称为数据成员。122 对象的状态在面向对象程序设计中,对象是类的实例。对象给类以生命,类想要做的事必须通过建立对象和在对象上进行操作而实现。创建类的对象的过程也叫实例化对象。对象知道什么能做和什么不能做,并且有能力修改和维护定义在对象上的数据。可以将对象看成是一个带有状态和行为的活的实体。属于同一个类中的对象具有相同的行为,但是有各自独立的状态。什么是对象的状态?在现实世界中一个对象能独立存
16、在的原因是它们有各自的特征,这些特征就是对象的状态。对于一个人来说,姓名、性别、身高都是其状态。在前面的讨论中,对象的属性与对象的状态是相同的概念。这里,给对象的状态下一个定义:对象的状态是所有静态属性和这些属性的动态值的总和。,以银行账户为例,BankAccount 类对象有一项数据成员balance( 余额 ) 。假设银行不允许透支,那么每个账户的余额(balance)不应小于零。这是所有银行账户类对象的公共属性,也可以说是任何一个银行账户类对象的静态属性 。这类属性是不需要检测的。然而,在 BankAccount 类对象的生存期的任何时刻,账户中的余额是包含在balance 这个数据成员
17、中的数值。当在对象上发生存款、转账、取款等行为时,会引起该数值的变化。因此,账户余额是一个动态变化的值,换句话说,数据成员 balance的值是动态的。对象的状态通常不仅仅是初等的数据类型( 整型、实型、字符型等) ,而且许多对象将另一个对象作为它们状态的一部分。例如,一辆车有发动机、车轮、座位,发动机是另外一个对象,它可以作为车的状态的一部分,。又例如,一个银行对象可以将银行账户对象和顾客对象作为它的状态的一部分。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 13 页5 / 13 一辆车一个学校123 对象的交互现实世界中的对象不是
18、孤立存在的实体,他们之间存在着各种各样的联系,正是它们之间的相互作用、联系和连接,才构成了世间各种不同的系统。同样,在面向对象程序设计中,对象之间也需要联系,我们称为对象的交互。面向对象程序设计技术必须提供一种机制,允许一个对象与另一个对象的交互。这种机制叫消息传递 。在面向对象程序设计中的消息传递,实际是对现实世界中的信息传递的直接模拟。一个对象向另一个对象发出的请求被称为“消息”。消息是一个对象要求另一个对象执行某个功能操作的规格的说明,通过消息传递才能完成对象之间的相互请求或相互协作。例如,我们有一个银行账户对象和一个顾客对象,顾客对象可以请求银行账户对象的服务,如“存入300 元”、“
19、取出200 元”等,当银行账户对象接到请求后,确定应执行的相应的操作并执行。在此,我们有必要介绍一下方法的概念。方法 是面向对象程序设计中的一个术语。我们知道,属于一个类的对象具有相同的行为,当某个行为作用在对象时,我们就称对象执行了一个方法。方法定义了一系列的计算步骤。所以,我们可以说一个对象请求另一个对象执行一个特定的方法,或者说一个对象发送一个消息给另一个对象,引起那个对象方法的执行。从这个意义上看,对象的行为是负责响应消息并进行操作。一般情况下,我们称发送消息的对象为发送者或请求者,接收消息的对象为接收者或目标对象 。对象中的联系只能通过消息传递来进行。接收者只有在接收到消息时,才能被
20、激活,被激活的对象会根据消息的要求完成相应的功能。消息具有三个性质: (1)同一个对象可以接收不同形式的多个消息,做出不同的响应; (2)相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的; (3)消息的发送可以不考虑具体的接受者,对象可以响应消息,也可以不响应。实际上,对象之间的消息传递机制对应于面向过程程序设计的过程调用。消息传递并非真的传递信息,它的实质就是方法的调用。只不过方法的调用受到消息的控制,而过程调用是直接的。消息的内容一般应包括接收者的名字、请求的方法、一个或多个参数。由发送者向接受者发送一条消息,就是要求调用特定的方法。所调用的方法可能引起对象状态的改变,还可能会
21、生成更多的消息,而导致调用其它对象中的方法。在面向对象程序设计中,消息分为两类:公有消息和私有消息。假设有一批消息同属于一个对象,其中一部分消息是由其它对象直接向它发送的,称为公有消息 ;另一部分消发动机座位座位座位车轮车轮车轮学生学生教师教师精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 13 页6 / 13 息是它向自己发送的,称为私有消息 。公有消息与私有消息的确定,与消息要求调用的方法有关。如果被调用的方法在对象所属的类中是在public下说明的,则为公有;是在private下说明的,即为私有。当然,私有消息只能发送调用属于它自
22、己的方法。例如,一个银行账户对象的类定义是BankAccount ,一个顾客对象可以发送一个公有消息 WithDraw 给银行账户对象,要求取款。这个消息是公有消息。124 类的确定与划分我们知道,面向对象程序设计技术是将系统分解成若干对象,对象之间的相互作用构成了整个系统。而类是创建对象的样板,在整体上代表一组对象,设计类而不是设计对象可以避免重复的编码工作,类只需编码一次,就可以创建所有的对象。所以,当我们辑决实际问题时,需要正确地进行分“类”。我们必须理解一个类究竟表示的是哪一组对象,如何把实际问题中的事物汇聚成一个个的“类”,而不是一组数据。这是面向对象程序设计中的一个难点。例如,考虑
23、银行系统,我们至少应该有两类对象:顾客类和银行账户类。学校系统应至少包含两类对象:学生和教师。如何确定和划分类?类的确定和划分并没有统一的标准和固定的方法,基本上依赖设计人员的经验、技巧以及对实际问题的把握。一个基本的原则是:寻求一个大系统中事物的共性,将具有共性的系统成分确定为一个类。这里以模拟一个学校系统为例。系统想要达到的目标不同,确定和划分的类就不相同。若模拟的目的是为了管理教案,设置的类可能是学生、教师、教材、课程、教室、图书等。若模拟的目的是管理后勤工作,设置的类可能是宿舍、食堂、后勤工作人员、教室、图书馆等。确定一个事物是一个类的第一步 ,是要判断它是否有一个以上的实例,如果有,
24、则它可能是一个类;第二步 ,我们还要判断类的实例中有否绝对的不同点,如果没有,则它是一个类。因为类的每一个实例是相似的,具有相同的行为和属性结构。例如,颜色(Color)与鲜花联系在一起只是鲜花的一种状态,因为表示颜色的是一些值:红、黄、紫、白等,所以,在此Color 不是一个类。然而,如果我们把颜色同包括复杂颜色计算的图形处理系统联系在一起,则Color 是一个类,因为这时的颜色是基于颜色三元素( 红、绿、蓝 )的成分比例和色度的变量,它不仅仅是一个数值,还可以附带很多的行为。不能把一组函数组合在一起构成类。也就是说,不能把一个面向过程的模块直接变成类。如果简单地将模块中的函数变成成员函数而
25、使其成为类是错误的。类不是函数的集合。例如,考虑一个包含一组数学函数的模块,现在我们定义一个类Mathhelper : class Mathelper public: double sqrt(double aNumber), double Power(double aNumber,int raiseto) double Inverse(double aNumber); private:/ 任何数据项,也可能没有 ;确定 Mathelper为一个类是错误的。问题在于该类中没有需要管理的私有数据。用户只需要提供参数对成员函数进行调用。这与面向过程的程序设计的函数调用没有根本的区别。设计类要有一个明
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年第章面向对象程序设计概述 2022 年第章 面向 对象 程序设计 概述
限制150内