第章面向对象程序设计概述

上传人:do****y1 文档编号:158291887 上传时间:2022-10-03 格式:DOCX 页数:15 大小:60.12KB
收藏 版权申诉 举报 下载
第章面向对象程序设计概述_第1页
第1页 / 共15页
第章面向对象程序设计概述_第2页
第2页 / 共15页
第章面向对象程序设计概述_第3页
第3页 / 共15页
资源描述:

《第章面向对象程序设计概述》由会员分享,可在线阅读,更多相关《第章面向对象程序设计概述(15页珍藏版)》请在装配图网上搜索。

1、第1章面向对象程序设计概述近年来,面向对象程序设计的思想已经被越来越多的软件设计人员所接受。它是在吸收结构化程疗: 设计的切优点的基础上发展起来的种新的程序设计思想。这种新的思想更接近人的思维活动,人们 利用这种思想进行程序设计时,可以很人程度地提高编程能力,减少软件维护的开销。面向对象系统 最突出的特点是封装性、继承性和多态性。1. 1什么是面向对象程序设计在软件设计和实现中,传统的被人们广泛使用的方法是面向过程的程序设计方法。在讨论而向 对象程序设计之前,我们需要讨论-下面向过程的程序设计。1. 1. 1面向过程程序设计的基本概念面向过程的程序设计思想的核心是功能的分解:第步要做的工作就是

2、将问题分解成若干个称为模块的功能块。第二步根据模块功能来设计系列用于存储数据的数据结构。第三步编写一些过程(或函数)对这些数据进行操作。显然,这种方法将数据结构和过程作为两个实体来对待,其着重点在过程。设计人员首先考虑如何将功能分解,在每个过程中又要着重安排程序的操作序列,但同时程序员在 编程时又必须时时考虑数据结构,因为毕竟要将操作作用于数据上。数据结构和过程的这种分离,给 软件人员造成沉重的负担。例如,我们不可能耍求数据结构始终没有变化,且不说在软件维护的时候 数据结构有可能发生变化,就是在软件开发的过程中也不能保证数据结构不变化。面向过程的程序设 计的缺点之就是旦数据结构需要变更的时候,

3、必须修改与之有关的所有模块。因此,闻向过程的程 序的可重用性差,维护代价高。下面,我们举个实例来进步讨论闻向过程的程序设计方法。考虑个银行系统。该系统允许顾客开设不同类型的银行账户,其中包括现金账户、支票账户和 贷款账户,同时允许顾客存款、取款和转账。根据而向过程的程序设计方法,首先我们将银行系统分 解成三个模块分别负责存款、取款和转账三项工作。这三个过程是MakeDeposit. WithDraw和 Transfer。 接着,建立个简单的数据结构:struct account char name:unsigned long accountld;float balancefloat inter

4、estYTD/*姓名*/*账号*/*余额*/char accountType/*年利息*/*账户类型(现金、支票和贷款)*然后,对每个过程按照定的操作顺疗:编写程疗:。我们来分析下,程序员所关心的是否与顾客致。(1)对于个顾客来说,他最关心的是账户中还有多少钱,利息是参少,钱存在银行是否安全,而不 会对存钱和取钱的程序执行的过程感兴趣。对他而言,只是需要知道存、取1 /13款手续,并按照这些手续去做就足够了。(2)程序设计人员所关注的是如何写存、取款的代码,如何在已经建立的数据结构中填写数据并管 理它们。可见,程序员与顾客关心的事情是不致的,这是由于数据结构与“过程”的分离造成的。再进步分 析

5、,顾客与他们的银行账户有没有特殊的关系。在软件系统中,由于顾客只不过是串字符和数字,踞 而不用考虑到底是谁拥有该账户,账户里的内容是什么,而银行账号也只不过是一个整数。另外,由于数据结构与“过程”的分离,程序员可以非常方便地修改账目,因为对他来说 只不 过是在修改数据结构中的数字,实际上他可能通过修改数据而取走顾客的钱。最后,我们考虑如果数据结构发生了 些变化会产生什么样的结果。对于 accountType 数据项,原来 只有现 金账户、支票账户和贷款账户三种取值,程序只能识别这三种取值。由于账户类型的不同,我 们 在编写存款等过程时,将以不同的操作序列与之对应(在同个过程中分情况处理)。对现

6、金账户、 支票账户和贷款账户的处理不会完全和同。假设现在需要增加-种账户类型一一退休账户,后果如何? 原来的程序肖定出错。因为在原来的程序中我们只考虑了以上三种账户的情况,对于新增加的账户类 型,原来的程序不会处理。也就是说,每增加种新的账户类型,都必须重新编写程序代码,可见其维 护软件的开销是相当大的。上述这些问题的出现都是由于面向过程程序设计的解决方法的着重点在功能,而我们通过分析发 现,数据对于客户(尤其是顾客)似乎更重要。在这里,程序员关心的是如何做(how to do),而顾客 则关心的是做什么(what to do),这是由于过程和数据的分离造成的。使用而向对象的程序设计技术 是解

7、决这些问题的最好方法。1. 1. 2面向对象程序设计的基本概念在而向对象的程序设计中,着重点在那些将要彼操作的数据,而不是在实现这些操作的过程。数据构成了软件分解的基础,而不是功能。我们首先要分析顾客在账户(数据)中妥做什一么,然 后提供相应的操作,更重要的是不能将数据和相应操作看成两个分离的实体,而是耍把它们作为个完 整的实体来对待。数据与定义在它上面的用户需要的操作构成个整体。同时,数据本身不能彼外部程 序和过程直接存取。如果想修改银行账户中的数据,惟的办法是在该数据上捉供修改操作,这些修改 操作是以用户应得到的利益为根据。当我们把对银行账户的操作定义在数据上,银行账户就是个类, 称为银行

8、账户类。作为其实例,我们可 以建立许多 具体的银行账户,而每一个具体的银行账户就是银行账户类的-个对象。现在,我们给面向对象程序设计下一个定义。面向对象程序设计是种新的程序设计范型。而向对象程序的主要结构特点是:第、程序般由类的定 义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递息的规律:第二,程序中的切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法完成和 应的操作。面向对象程序设计的最大优点就是软件具有可重用性。当人们对软件系统的要求有所改变 时,并不 需要程序员做大量的工作,就能使系统做相应的变化。类与对象是而向对象程序设计中最重要的概念,也是个难点,想要

9、掌握而向对象程序设计的技术,首先就要很好地理解这两个概念。2/131. 2对象与类1. 2. 1对象与类的概念在现实世界中,人们是如何认识“对象”和“类”的。在日常生活中对象就是我们认识世界的基本单元,它可以是人,也可以是物,还可以是件事。整个世 界就是由形形色色的“对象”构成的。例如辆车、个球、个小学生、次演出。对象既可以很简 单,也可以很复杂,复杂的对象可以由若干简单的对象构成。对象是现实世界中的一个实体,其特性是: (1) 每个对象必须有个名字以区别于其它对象: (2) 用属性(或叫状态)来描述它的某些特征: (3) 有一组操作,每-个操作决定对象的一种 行为。在日常生活中,“类”是对组

10、具有共同的属性特征和行为特征的对象的抽象。例如,由个个的 人构成人类,而一个人是人类的一个实例。类和对象之间的关系是抽象和具体的关系。类是对参个对象进行综合抽象的结果,对象又是类的个 体实物,个对象是类的个实例。例如,教师黎明和学生李明都是个对象。对象名:黎明对彖名:李明对象的属性:对象的属性:年龄:30年龄:20学历:博士学历:本科职称:教授性别:男专业:计算机软件专业:计算机科学与技术对象的操作:对象的操作:说自己的年龄打篮球吃饭睡觉授课听课个个的像黎明这样的教师就构成教师类。个个的像李明这样的学生就构成学生类。我们前面说过,面向对象程序设计更接近人们的思维。而向对象程序设计中的对象和就来

11、源于现 实世界。以面向对象程序设计的观点看,个对象是由描述其属性的数据和定义在其上血的组操作组 成的实体,是数据单元和过程单元的组合体。类是对组对象的抽象,这组对象具有相同的属性结构和 操作行为,在对象所属的类中要说明这些结构和行为。个对象是类的个实例。有了类,才可以创建 对彖。现在我们给出类的更精确的定义:类是创建对象的样板,它包含对创建对象的状态描述 和对操 作行为的说明。如果用而向对象的观点来分析银行账户问题,着重点在银行账户上,而不是在存款和取款的行为上, 那么,银行账户就是i个类。class BankAccountpublic:void MakeDeposit(float amoun

12、t):float WithDraw(float amount):bool Transfer(BankAccount&to, float amount):3/13private:float balance:float interestYTD:char*owner :int account_number:);在 BankAccount 类中,说明的行为是MakeDepositx WithDraw和 Transfero 这些行为对干任何 客户来说是很重要的,他们在银行开户的目的就是耍进行存款、取款以及转账。正因为每个顾客(作 为类的实例)都可能做这些操作,所以对行为的说明是public,即公有的。同

13、时,在 BankAecount 类 中,还说明了数据 balance、 interestYTD, owner 和 accountnumber, 这些数据是私有的,只能在 彼定义的类中进行操作。作为银行账户类的实例,银行的每个银行账户都是个对象。每个银行账户对象有相同的 结构和 行为。因此,任何个银行账户对象都可以使用在类中说明的MakeDeposit等操作,而且每个银行账户 对象有和同类型的数据结构balance等。在而向对象程序设计中,个类只在源程序的代码中出现,而并不会在个正在内存运行的程序中出 现,即类只是在编译时存在:对象作为类的实例在运行的程序中出现,并占有内存空间,它是在运行 时存

14、在的实体。所以个类实际上是种新的数据类型,当我们耍用个新的数据类型时,肖先耍在源程 序中说明,而说明部分的代码是不在内存中运行的。在程序中运行的是该类的对象,对彖在内存完 成。注意,我们在此必须严格区分说明和定义。前而我们用C+写的程序段是对类 BankAccount 的说 明。 在C+的类中,我们把那些行为称为成员函数,而把数据称为数据成员。1. 2. 2对象的状态在而向对象程序设计中,对象是类的实例。对象给类以生命,类想要做的事必须通过建立对象和在 对象上进行操作而实现。创建类的对象的过程也叫实例化对象。对象知道什么能做和什么不能做,并 且有能力修改和维护定义在对象上的数据。可以将对象看成

15、是个带有状态和行为的活的实体。属于同个类中的对象具有相同的行 为,但是有各 自独立的状态。什么是对象的状态?在现实世界中个对象能独立存在的原因是它们有各自的特征,这 些特征就是对象的状态。对于一个人来说,姓名、性别、身高都是其状态。在前而的讨论中,对象的属性与对象的状态是相同的概念。这里,给对象的状态下个定义:对象的状 态是所有静态属性和这些属性的动态值的总和。,以银行账户为例, BankAccount 类对象有-项数据成员 balance (余额)。假设银行不允许透支,那么每个账户的余额(balance)不应小于零。这是所有银行账户类对象的公共属性,也可以说是 任何个银行账户类对象的静态属性

16、。这类属性是不需要检测的。然而,在BankAccount类对象的生存 期的任何时刻,账户中的余额是包含在 balance 这个数据成员中的数值。当在对象上发生存款、转 账、取款等行为时,会引起该数值的变化。踞此,账户余额是-个动态变化的值,换句话说,数据成员 balance 的值是动态的。对象的状态通常不仅仅是初等的数据类型(整型、实型、字符型等),而且许多对象将另个对彖作为 它们状态的啷分。例如,辆车有发动机、车轮、座位,发动机是另外个对象,它可以作为车的状态 的部分,。又例如,个银行对象可以将银行账户对象和顾客对象作为它的状态的部分。辆车4/13个学校发动学学座座座教教车车车1. 2. 3

17、对象的交互现实世界中的对象不是孤立存在的实体,他们之间存在着各种各样的联系,正是它们之间的相互 作用、联系和连接,才构成了世间各种不同的系统。同样,在面向对象程序设计中,对象之间也需要联 系,我们称为对象的交互。而向对象程序设计技术必须提供种机制,允许个对象与另一个对彖的交互。 这种机制叫消息传递。在面向对象程序设计中的消息传递,实际是对现实世界中的信息传递的直接模拟。个 对象向另 个对象发出的请求彼称为“消息”。消息是个对象要求另个对象执行某个功 能操作的规格的说 明,通过消息传递才能完成对象之间的相互请求或相互协作。例如,我们有个银行账户对象和-个顾客对象,顾客对象可 以请求银行账户对象的

18、服务,如“存入300元”、“取出200元”等,当银行账户对象接到请求后,确 定应执行的相应的操作并执行。在此,我们有必要介绍下方法的概念。方法是面向对象程序设计中的个术语。我们知道,属于 个类的对象具有相同的行为,当某个行为作用在对象时,我们就称对象执行了 个方法。方法定义了 系列的计算步骤。所以,我们可以说个对象请求另个对象执行个特定的方法,或者说个对象发送 个消息给另个对象,引起那个对象方法的执行。从这个意义上看,对彖的行为是负责响应消息并进行 操作。般情况下,我们称发送消息的对象为发送者或请求者,接收消息的对象为接收者或目标对象。 对象中的联系只能通过消息传递来进行。接收者只有在接收到消

19、息时,才能被激洁,彼激活的对象会 根据消息的要求完成相应的功能。消息具有三个性质:(1)同-个对象可以接收不同形式的多个消息,做出不同的响应:相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的:(3) 消息的发送可以不考虑具体的接受者,对象可以响应消息,也可以不响应。实际上,对象之间的消息传递机制对应于面向过程程序设计的过程调用二消息传递并非真的传 递信 息,它的实质就是方法的调用。只不过方法的调用受到消息的控制,而过程调用是直接的。消息的内容一般应包括接收者的名字、请求的方法、一个或多个参数。由发送者向接受者发送条消息,就是妥求调用特定的方法。所调用的方法可能引起对象状态的改变,

20、还可能会生成更多的消息,而导致调用其它对象中的方法。在面向对象程序设计中,消息分为两类:公有消息和私有消息。假设有批消息同属于个对象,其中 部分消息是由其它对象直接向它发送的,称为公有消息;另部分消5/13息是它向自己发送的,称为 私有消息.公有消息与私有消息的确定,与消息要求调用的方法有关。如果被调用的方法在对象所属的 类中 是在public下说明的,则为公有:是在private下说明的,即为私有。当然,私有消息只能发送调用 属于它自己的方法。例如,个银行账户对彖的类定义是 BankAccount, 个顾客对象可以发送个公有消息 WithDraw 给银 行账户对象,要求取款。这个消息是公有消

21、息。1. 2. 4类的确定与划分我们知道,面向对象程序设计技术是将系统分解成若干对象,对象之间的相互作用构成了整个系 统。而类是创建对象的样板,在整体上代农组对象,设计类而不是设计对象可以避免重复的编码工 作,类只需编码次,就可以创建所有的对象。所以,当我们辑决实际问题时,需要正确地进行分“类”。我们必须理解-个类究竟衣示的是哪组对象,如何把实 际问题中的事物汇聚成一个 个的“类”,而不是组数据。这是面向对象程序设计中的个难点。例如,考虑银行系统,我们至少应该有两类对象:顾客类和银行账户类。学校系统应至少包含两类 对象:学生和教师。如何确定和划分类?类的确定和划分并没有统的标准和固定的方法,基

22、本上依赖设计人员的 经验、技巧以及对实际问题的把握。个基本的原则是:寻求-个人系统中事 物的共性,将具有共性的系统成分确定为一个类。这里以模拟-个学校系统为例。系统想耍达到的目标不同,确定和划分的类就不相同。若模拟的 目的是为了管理教案,设置的类可能是学生、教师、教材、课程、教室、图书等。若模拟的目的是管 理后勒工作,设置的类可能是宿舍、食堂、后勤工作人员、教室、图书馆等。确定个事物是个类的第一步,是要判断它是否有个以上的实例,如果有,则它可能是个类; 第二步,我们还要判断类的实例中有否绝对的不同点,如果没有,则它是个类。因为类的每一个实例 是和似的,具有相同的行为和属性结构。例如,颜色 (C

23、olor) 与鲜花联系在起只是鲜花的种状态,因为衣示颜色的是些值:红、黄、 紫、白等,所以,在此Color不是个类。然而,如果我们把颜色同包括复杂颜色计算的图形处理系统 联系在起,则Color是-个类,因为这时的颜色是基于颜色三元素(红、绿、蓝)的成分比例和色度的 变量,它不仅仅是-个数值,还可以附带很多的行为。不能把组函数组合在起构成类。也就是说,不能把个面向过程的模块直接变成类。如果简单 地将模块中的函数变成成员函数而使其成为类是错谋的。类不是函数的集合。例如,考虑-个包含组数学函数的模块,现在我们定义个类Mathhelper: class Mathelperpublic:double s

24、qrt(double aNumber).double Power(double aNumber, int raiseto)double Inverse(double aNumber):private: 任何数据项,也可能没有;确定Mathelper为个类是错谋的。问题在于该类中没有需要管理的私有数据。用户只需要捉供参 数对成员函数进行调用。这与而向过程的程序设计的函数调用没有根本的区别。设计类要有个明确的目标。个好的类应该是容易理解和使用的。我们不能设计个 6/13Color类来衣示鲜花的颜色,但是可以在图形处理系统中将颜色Color设计为类。因为在两个系统中对 颜色的耍求不同。1. 3数据的

25、抽象与封装面向对象系统中最突出的特性是封装性、继承性和多态性。我们首先来讨论封装性,封装与数据 抽象的概念密切和关。1. 3. 1现实世界中的抽象与封装抽象和封装的概念在现实世界中广泛存在,尤其在科学技术日益发展的今天,人量的电器被人们 使用,对电器的使用体现了抽彖与封装的概念。以录音机为例,录音机上有若干按键,当人们使用录音机时,只要根据白己的需要,如放音、录 音、停止、倒带等,按下与之对应的键,录音机就会完成相应的工作。这些按键安装在录音机的农 而,人们通过它们与录音机交互。我们无法(当然也没必要)操作录音机的内部电路,因为它们彼装在 机壳里,录音机的内部情况对于用户来说是隐蔽的,不可见的

26、。这就是所谓封装的原理。那么,我们是如何知道放音按哪个键,停止又按哪个键的呢?是录音机的操作说明书告诉我们的,但操作说明书并不告诉我们录音机的内部将如何去做这些事。操作说明书在录音机做什么(what td do) 与怎样做 (how to do) 之间做出了明确的区分。这就是所谓抽象的原理。抽象出来的是做什 么,而不关心如何实现这些操作。以般观点而言,抽象是通过特定的实例或例了抽取共同性质以后形成概念的过程。抽象是对系 统的简化描述或规范说明,它强调了系统中的部分细节和特性,例如做什么,而忽略了其它部分,例 如如何做。抽象的描述被称为它的规范说明,例如录音机的操作说明书,而对抽象的解释称为它的

27、实 现。1. 3. 2数据的抽象与封装的基本概念将上述观点用在数据结构上,就不难理解数据的抽象与封装。将数据结构和作用于数据结构上的 操作组成个实体,数据的农示方式和对数据的操作细节被隐藏起来,用户通过操作接口对数据进行操 作。对于用户来说,只知道如何通过操作接口对该数据进行操作,而并不知道是如何做的也不知道数 据是如何农示的。这就是数据的封装:数据的抽象则是通过对数据实例的分析,抽取其共同性质的结果。数据的抽象和我们前而讨论的类的 概念之间显然存在着很强的和似性。在而向对象程序设计中,数据的抽象是在确定类时强调对象的共同点而忽略它们的不同点的结果。也可以说,在个类的说明中我们只衣示那些主要特

28、性,而忽略次要的、引不起我们 兴趣的东西。数据的封装则是隐藏了抽象的内部实现细节的结果。封装是将数据抽象的外部接口与内部的实现细节清楚地分离开。抽象和封装是互补的。好的抽象有利于封装,封装的实体则帮助 维护抽象的完整性。重要的是抽象先于封装。以银行账户类为例, balance、 interestYTD、 owner、 accountnumber 等私有数据是彼封装的数据, MakeDepositx WithDrawA Transfer等成员函数的细节也同时被封装,用户看到的是MakeDeposit、 WithDraw Transfer 操作捉供的接口。7/13接口实现细节(不可见)Balanc

29、eInterestYTDOwnernumberaccouiiMakeDepositWithDraw MakeDeposit 用户不能存取的 TransferWithDrawTransfer在上闻的讨论中,我们并没有严格区分银行账户是类还是对彖,因为封装性不仅涉及到类的描述,也涉及到组成软件系统的对象。的角度来讨论封装似乎更合理,因为类并不真正占有存储空间。对象一一从类的实例一一 封装的单位实际是对象,但是对象的结构和行为是用它自己的类说明来描述的。对象的封装比类的封装更具体化。可以从下面几点来理解对象的封装:(1)对象具有个清楚的边界,对象的私有数据、成员函数的细节彼封装在该边界内: 具有个描

30、述 对象与其它对象如何相互作用的接口,该接口必须说明消息传递的使(2),用方法:对象内部的代码和数据应受到保护,其它对象不能直接修改。(3) 的观点看,对象提供了 组服务,并提供了请求服务的接口。从)从 用户(或应用程序员系统设计员的角度看,封装能清楚地标明对象提供的服务界面,而水乡的行为和数据是隐蔽的,不可 见。对象的这-封装机制,可以将对象的使用者和设计者分开。3对象的特性31.封装性。)(1模块的独立性。2)(动态连接性。)(3易维护性(4)8/131. 4继承性1. 4. 1继承的概念热血、有毛发、用奶哺育幼子孩了的父母狗(孩有犬牙、伶肉、特定的骨骼结构、群居柯利狗尖 从子、身体濒色红

31、口相间、适合放牧上图说明了哺乳动物、狗、柯利狗之间的继承关系。图中箭头 方向志向基对象。哺乳动物是种热血、有毛发、用奶哺育幼仔的动物:狗是有犬牙、食肉、特定的 骨骼结构、群居的哺乳动物:柯利狗是尖鼻(、身体颜色红白相闻、适合放牧的狗。在继承链中,每 个类继承了它前个类的所有特性。例如,狗具有哺乳动物的所有特性,同时还具有区别于其它哺的 特征。图中从下到上的继承关系是:柯利狗是狗,狗是哺乳动物。如猫、人象等)乳动物(“柯利 狗”类继承了 “狗”类的特性,“狗”类继承了 “哺乳动物”类的特性。以面向对象程序设计的观 点来看,继承所农 达的是对象类之间和关的关系。这种关系使得某类对象可以继承另外类对

32、象的特征和能力。若类之间具有继承关系.则它们之间具有下列几个特性:):类间具有共孚特征(包括数据和程序代码的共享(1):)类间具有差别或新增部分(包括非共享的数据和程序代码(2)类间具有 层次结构。(3) 包括(A的-切特征,则属于类B继承类AB中的对象具有类假设 有两个类A和B,若类的AB为类A为基类或父类或超类:而称继承类)数据属性和操作,这 时,我们 称彼继承类A中派生出来的。派生类或了 类。同时,我们还可以说,类B是从类派生出来的,就构成 了类的层次。这样,B又是从类A派生出来,而类C如果类B从类c。类的 间接基类直接基类是类B 的,是类cA我们又有了色接基类和间接基类的概念。类不但继

33、承它的直接基类的所有特性,还继承它 的所有间接基类的特征。对于动物继承链,用而向对象程序设计的术语,我们称“哺乳动物”是“狗” 的基类,“狗”是“哺乳动物”的派生类。“哺乳动物”、“狗”、“柯利狗”构成类的层次。“哺乳动物” 是“狗”的直接基类,是“柯利狗”的间接基类。的所有特A的派生类,那么,在构造类B的时候, 我们不必重新描述B如果类是类A的B不同的那些特性。也就是说,类征,我们只需让它继承类A的特征,然后描述与基类A特征由继承来的和新添加的两部分特征构成。,也就)(具 体 地说,继承机制允许派生类继承基类的数据和操作即数据成员和成员函数是说,允许派生类使 用基类 的数据和操作。同时,派生

34、类还可以增加新的操作和数据。例9/13如,/女类可以从父母类继承房/和 汽车,当然可以使用房了和汽车,还可以对房了进行再装修。继承的作用有两个:其,避免公用代码的重复开发,减少代码和数据冗余:其二,通过增强-致性来减少模块间的接口和界面。继承使程序不再是毫无关系的类的堆砌,而具有良好的结构。继承机制为程序员们提供r 种组织、构 造和重用类的手段。继承使个类(基类)的数据结构和操作被另个类(派生类)重用,在派生类中只 需描述其基类中没有的数据和操作。这样,就避免了公用代码的重复开发,增加了程 疗:的可重用性, 减少了代码和数据冗余。同时,在描述派生类时,程序员还可以覆盖基类的些操作,或修改和重定

35、义 基类中的操作,例如子女对所继承的房子进行装修。继承机制以相关的关系来组织事物,可以减少我们对相似事物进行说明和记忆的规模,为我们提 供了 种简化的手段。程序员可以将相关的类收集在起,生成高级的、概括了这些类的共性的类。 具有适应关系的类处于-个继承层次结构中,高层的类作为低层的类的抽象,使程序员能够忽略那些低 层类的不同实现细节,而按照高层类编写通用程序,并且在掌握了高层类的特 征以后,能够很快地掌 握低层类的特征,给编程工作带来方便。1. 4. 2继承的分类继承有两种分类方法,种是从继承源上分,另种是从继承内容上分。从继承源上分,继承分为单继承和多继承。单继承是指每个派生类只直接继承了

36、个基类的特征。前面介绍的动物链,就是个单继承 的实 例。图1. 5也衣示了 种单继承关系,即Windows操作系统的窗口之间的继承关系。单继承并不能解决继承中的所有问题,例如,小孩喜欢的玩具车既继承了车的些特性,又继承了 玩具的些特征,如图1. 6所示。此时“玩具车”类不是继承了 -个基类的特性,而是 继承了 “玩 具”和“车”两个基类的特性,这是-种多继承的关系。参继承是指多个基类派生出个派生类的继承关系,多继承的派生类直接继承了不II: 个基 类 的特征。从继承内容上划分,继承可分为取代继承、包含继承、受限继承、特化继承。取代继承:例如徒弟从师傅那里学到的所有技术,在任何需要师傅的地方都可

37、以由徒弟来替代, 这就属于取代继承。包含继承:例如“柯利狗”继承了 “狗”的所有特征,任何条“柯利狗”都是条“狗”,这就属于包含继承。受限继承:例如“鸵鸟”尽管继承了 “鸟”的些特征,但不能继承鸟会飞的特征,这就属于受限 继承。特化继承:例如“运动员”是-类特殊的人,比般人具有更多体育特长,这就属于特化继1. 4. 3继承与封装的关系在面向对象程序设计中,对象具有封装性,对象之间的联系只能通过消息传递来完成,对象的私 有数据和行为是彼隐藏起来的。那么,继承机制的引入是否削弱了封装性?继承与10/13封装是否产生 矛质?回答是否定的。继承与封装不但投有实质性的冲突,而且还有定的相似性。在面向对象

38、系统中,封装的单位是对象,也就是说,把个属于某类的对象封装起来,使其数据 和操作成为个整体。如果该对象所属的类是个派生类,那么,它只要把从基类那里继 承来的操作和 数据与自己的操作和数据并封装起来,就可以了。对象依然是封装好的整体,仍然只通过消息传递与 其它的对象交互,而不是直接调用。所以,个对象,无论它是基类的实例,还是派生类的实例,都是 个被封装的实体。因此,我们得出结论:继承机制的引入并不影响对象的封装性。从另角度看,继承与封装还有相似性,那就是它们都捉供了共享代码的手段,因而增加了代码的 重用性。继承捉供的代码共享是静态的,派生类对象在成为活动的实体以后,自动地共孕其基类中定义的 代码

39、段,从而使基类对彖与其派生类对象共享一段代码。封装捉供的代码共宇是动态的,例如我们在个类中说明了 段代码,那么属于该类的多个实例在 程序运行时共学在类中说明的那段代码。1. 5多态性1. 5. 1什么是多态性多态性也是而向对象系统的重要特性。在讨论面向对象程序设计的多态性之前,我们还是来看看 现实世界的多态性。现实世界的多态性在自然语言中经常出现。假设辆汽车停在了属于别 人的车位, 司机可能会听到这样的要求:“请把你的车挪开”,司机在听到请求后,所做的工作应该是把车开走。 在家里,把凳了挡住了孩了的去路,他可能会请求妈妈:“请把凳/挪开”,妈妈过去搬起凳/,放在 边。在这两件事情中,司机和妈妈

40、的工作都是“挪开” 样东西,但是他们在听到请求以后的行为是 截然不同的,这就是多态性。对于“挪开”这个请求,还可以有更 多的行为与之对应。“挪开”从字 面上看是相同的,但由于用的对象不同,操作的方法就不同。面向对象程序设计借鉴了现实世界的多态性。面向对象系统的多态性是指不同的对象收到相同的 的消息时产生多种不同的行为方式。例如,我们有个窗口 (Window) 类对象,还个棋Y- (ChessPiece)类对象,现在我们来考虑对它们都发出“移动”的消息,“移动”操作在Window类对 象和 ChessPiece 类对象上可以有不同的行为。C+语言支持两种多态性,即编译时的多态性和运行时的多态性。

41、编译时的多态性是通过重载来实现的,我们将在1. 5. 2介绍其概念。运行时的多态性是通过虚函数来实现的,程序运行的到底是 哪个函数版本,需要在运行时通过对象发送的消息来确定。由于虚函数的概念略为复杂,并且涉及到 c廿的语法细节,在此不做进步的讨论。1. 5. 2重载的概念重裁一般包括函数重救和运算符重载函数重载是指个标识符可同时用于为多个函数命名,而运算符 重栽是指个运算符可同时用于多种运算。也就是说,相同名字的函数或运算符在不同的场合可以农 现出不同的行为。下面我们给出个函数重载的例了。class Apublic:(int i) 语句段 1;11/13语句段2:void Print(floa

42、t f)(const charge) (语句段3:void Printvoid Print/其它语句;在上面的类定义中我们重载了三个函数,名字都是Print。它们有各自不同的功能,分别用 语旬 段1、语句段2、语句段3中的语句实现,在此略去语句的细节。函数名相同,而函数实现的功能不同。 那么,当有要求使用Print函数的消息发送时,到底应该执行函数的哪个呢?这 就要看消息传递的函 数参数是什么,根据参数来调用不同的同名函数。例如,发送的消息是Print (20),则执行的是语句段 1,而发送的消息是 Print (m welcome 则执行的是语句段3。为什么要使用重载?使用重载的目的是为了更

43、好地衣达行为共享,这种行为共享就像将相似 的操 作划分在起。使用重载可以使程序员在只知道操作的般介义,而不知道操作具体细节的 情况下能正 确地对某个对象使用一个操作。另外,使用重幸艮的直接益处是减少了程序员记忆操作名字的负担。例如,考虑打印整数和实数这个操作,如果不能使用重载,我们必须为不同类的对象定义不同的 操作名字,如Printinteger和PrintFloat。如果需要打印的对象类非常多,程序员将需要 记忆很多不 同的名字,增加了程序员的负担。使用重载以后,就像我们前面定义的A类样,我们只需记忆个名 字Print,在发送消息时给出对象的类型信息,编译器就能够确定惟的打印这类对象所使用的

44、方法。1. 6面向对象程序设计的语言进行面向对象的程序设计,必须使用而向对象程序设计语言。而向对象程序设计语言应该具备下 述特征:(1) 它支持对象的概念(包括对象所有的特性,如封装等);(2) 它要求对象属于类;(3) 它提供继承机制。下面我们将通过程疗:设计语言的历史演变介绍些而向对彖程序设计语言。程序设计的高级语言可以划分为四代。第代语言的显著特征是对数学衣达式有很强的运算处理能力,其代衣是50年代开发的FORTRAN 和60年代开发的Algol 60。FORTRAN是第个具有划时代意义的程序设计语言,许多重要的程序设计 语言概念,如变量、数组、控制结构等彼引入到程序设计语言中。在Alg

45、ol 60中人们捉出了块结构的概念,块与块之间对变量实旋隔离,即在个块中的变量可以 与其它块中的变量同名而不产生混淆,这是程序设计语言中第次尝试为数据提供保护和封装。第二代语言的重点是如何有效地衣达算法,其代农是Pascal和c。Pascal是第个提出结构化 程序设计的语言,但由于不适合推广到实用领域而成为比较理想的教案语言。70年代开发的c语言 提供了丰富的数据结构和运算符,具有结构化的控制语句,用函数作为程序模块以实现程序的模块 化,是面向过程程序设计的理想语言。第三代语言是引入了抽象数据类型的程序设计语言,例如Ada。Ada语言包含-些常见的程序控 制流,并具有定义新的类型、函数和了例程

46、的能力。Ada彼认为是基于对象的语言,因为它虽然支持 抽象数据类型、函数和运算符重载以及多态性等而向对象的机制,但不支持继承。Ada语言中具有面 向对象的构造:包。12/13第四代语言就是而向对象程序设计的语言了。这类语言包 15 Smalltalk. ObjecfC. Eiffel 以 及C+等。才是到面向对象程序设计语言,必须提到60年代开发的Simula 67,因为它彼公认为是面向对象 语言的鼻祖。它提供了对象、类,以及继承的概念,奠定了面向对象语言的基础,并提出了面向对象 的术语。它的主要用途是进行仿真建模。在70年代和80年代这时期,来自于 Simula 和其它早期的原型语言中的面向

47、对象的概念在 Smalltalk 语言中得到了完整的体现。 Smalltalk 是当今最有影响的面向对象语言之 Smalltalk 语言 包括了 Simula的而向对象的特征,如对象、类、继承等,而且数据封装比Simula更严格。 Smalltalk 从70 年代开始开发,经历了 Smalltalk - 72、Smalltalk - 7 6 和 Smalltalk 8 0 几个 版本,现在我们-般用 Smalltalk 80.Ohjeet-C 是在1983年前后开发的,它是对c进行扩充以后形成的面向对象的语言,但它的语法 更像Smalltalk。ObjecfC并不是像C+那样通过扩充已有的C语言的语法来捉供而向对象的支持, 而是完全依赖于新引入的构造和运算符来完成类宦义和消息13/13

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!