欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年第章面向对象程序设计概述.docx

    • 资源ID:27877803       资源大小:153.91KB        全文页数:22页
    • 资源格式: DOCX        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年第章面向对象程序设计概述.docx

    精选学习资料 - - - - - - - - - 第1章 面对对象程序设计概述近年来,面对对象程序设计的思想已经被越来越多的软件设计人员所接受;它是在吸取 结构化程序设计的一切优点的基础上进展起来的一种新的程序设计思想;这种新的思想更接 近人的思维活动,人们利用这种思想进行程序设计时,可以很大程度地提高编程才能,削减 软件爱护的开销;面对对象系统最突出的特点是封装性、继承性和多态性;11 什么是面对对象程序设计在软件设计和实现中,传统的被人们广泛使用的方法是面对过程的程序设计方法;在讨 论面对对象程序设计之前,我们需要争论一下面对过程的程序设计;111 面对过程程序设计的基本概念面对过程的程序设计思想的核心是功能的分解:第一步要做的工作就是将问题分解成如干个称为模块的功能块;其次步 依据模块功能来设计一系列用于储备数据的数据结构;第三步编写一些过程 或函数 对这些数据进行操作;明显,这种方法将数据结构和过程作为两个实体来对待,其着重点在过程;设计人员第一考虑如何将功能分解,在每一个过程中又要着重支配程序的操作序列,但 同时程序员在编程时又必需时时考虑数据结构,由于到底要将操作作用于数据上;数据结构 和过程的这种分别,给软件人员造成繁重的负担;例如,我们不行能要求数据结构始终没有 变化,且不说在软件爱护的时候数据结构有可能发生变化,就是在软件开发的过程中也不能 保证数据结构不变化;面对过程的程序设计的缺点之一就是一旦数据结构需要变更的时候,必需修改与之有关 的全部模块;因此,面对过程的程序的可重用性差,爱护代价高;下面,我们举一个实例来进一步争论面对过程的程序设计方法;考虑一个银行系统;该系统答应顾客开设不同类型的银行账户,其中包括现金账户、支 票账户和贷款账户,同时答应顾客存款、取款和转账;依据面对过程的程序设计方法,第一 我们将银行系统分解成三个模块分别负责存款、取款和转账三项工作;这三个过程是 MakeDeposit 、 WithDraw 和 Transfer ;接着,建立一个简洁的数据结构: struct account char name ; /* 姓名 */ *unsigned long accountld; /*账号 * float balance /* 余额 */ float interestYTD * 年利息 * char accountType*账户类型 现金、支票和贷款 ;然后,对每个过程依据肯定的操作次序编写程序;我们来分析一下,程序员所关怀的是否与顾客一样;(1)对于一个顾客来说,他最关怀的是账户中仍有多少钱,利息是多少,钱存在银行 是否安全,而不会对存钱和取钱的程序执行的过程感爱好;对他而言,只是需要知道存、取1 / 13 名师归纳总结 - - - - - - -第 1 页,共 13 页精选学习资料 - - - - - - - - - 款手续,并依据这些手续去做就足够了;(2)程序设计人员所关注的是如何写存、取款的代码,如何在已经建立的数据结构中 填写数据并治理它们;可见,程序员与顾客关怀的事情是不一样的,这是由于数据结构与“ 过程” 的分别造成 的;再进一步分析,顾客与他们的银行账户有没有特别的关系;在软件系统中,由于顾客只 不过是一串字符和数字,因而不用考虑到底是谁拥有该账户,账户里的内容是什么,而银行 账号也只不过是一个整数;另外,由于数据结构与“ 过程” 的分别,程序员可以特别便利地修改账目,由于对他来 说,只不过是在修改数据结构中的数字,实际上他可能通过修改数据而取走顾客的钱;最终,我们考虑假如数据结构发生了一些变化会产生什么样的结果;对于accountType数据项,原先只有现金账户、支票账户和贷款账户三种取值,程序只能识别这三种取值;由于账 户类型的不同,我们在编写存款等过程时,将以不同的操作序列与之对应 在同一个过程中 分情形处理 ;对现金账户、支票账户和贷款账户的处理不会完全相同;假设现在需要增加一种账户类型退休账户,后果如何.原先的程序确定出错;由于在原先的程序中我们只考虑了以上三种账户的情形,对于新增加的账户类型,原先的程序不会处理;也就是说,每 增加一种新的账户类型,都必需重新编写程序代码,可见其爱护软件的开销是相当大的;上述这些问题的显现都是由于面对过程程序设计的解决方法的着重点在功能,而我们通 过分析发觉,数据对于客户 特别是顾客 好像更重要;在这里,程序员关怀的是如何做 how ,这是由于过程和数据的分别造成的;使用 to do ,而顾客就关怀的是做什么 what t0 do 面对对象的程序设计技术是解决这些问题的最好方法;112 面对对象程序设计的基本概念在面对对象的程序设计中,着重点在那些将要被操作的数据,而不是在实现这些操作的过 程;数据构成了软件分解的基础,而不是功能;我们第一要分析顾客在账户 数据 中要做什 么,然后供应相应的操作,更重要的是不能将数据和相应操作看成两个分别的实体,而是要 把它们作为一个完整的实体来对待;数据与定义在它上面的用户需要的操作构成一个整体;同时,数据本身不能被外部程序和过程直接存取;假如想修改银行账户中的数据,惟一的办 法是在该数据上供应修改操作,这些修改操作是以用户应得到的利益为依据;当我们把对银 行账户的操作定义在数据上,银行账户就是一个类,称为银行账户类;作为其实例,我们可 以建立很多详细的银行账户,而每一个详细的银行账户就是银行账户类的一个对象;现在,我们给面对对象程序设计下一个定义;面对对象程序设计是一种新的程序设计范型;面对对象程序的主要结构特点是:第一,程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们 之间传递息的规律;其次,程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动 有关方法完成相应的操作;面对对象程序设计的最大优点就是软件具有可重用性;当人们对软件系统的要求有所转变 时,并不需要程序员做大量的工作,就能使系统做相应的变化;类与对象是面对对象程序设计中最重要的概念,也是一个难点,想要把握面对对象程序 设计的技术,第一就要很好地懂得这两个概念;2 / 13 名师归纳总结 - - - - - - -第 2 页,共 13 页精选学习资料 - - - - - - - - - 12 对象与类121 对象与类的概念在现实世界中,人们是如何熟悉“ 对象” 和“ 类” 的;在日常生活中对象就是我们熟悉世界的基本单元,它可以是人,也可以是物,仍可以是 一件事;整个世界就是由形形色色的“ 对象” 构成的;例如一辆车、一个球、一个学校生、一次演出;对象既可以很简洁,也可以很复杂,复杂的对象可以由如干简洁的对象构成;对象 是现实世界中的一个实体,其特性是: 1 每一个对象必需有一个名字以区分于其它对象;用属性 或叫状态 来描述它的某些特点; 2 3 有一组操作,每一个操作打算对象的一种行为;在日常生活中,“类 ” 是对一组具有共同的属性特点和行为特点的对象的抽象;例如,由一个个的人构成人类,而一个人是人类的一个实例;类和对象之间的关系是抽象和详细的关系;类是对多个对象进行综合抽象的结果,对象又 是类的个体实物,一个对象是类的一个实例;例如,老师清晨和同学李明都是一个对象;对象名:清晨对象名:李明 对象的属性:对象的属性:年龄: 30 年龄: 20 学历:博士学历:本科 职称:教授 性别:男 专业:运算机软件专业:运算机科学与技术 对象的操作:对象的操作:吃饭说自己的年龄睡觉打篮球授课听课一个个的像清晨这样的老师就构成老师类;一个个的像李明这样的同学就构成同学类;我们前面说过,面对对象程序设计更接近人们的思维;面对对象程序设计中的对象和就 来源于现实世界;以面对对象程序设计的观点看,一个对象是由描述其属性的数据和定义在 其上面的一组操作组成的实体,是数据单元和过程单元的组合体;类是对一组对象的抽象,这组对象具有相同的属性结构和操作行为,在对象所属的类中要说明这些结构和行为;一个 对象是类的一个实例;有了类,才可以创建对象;现在我们给出类的更精确的定义:类是创建对象的样板,它包含对创建对象的状态描述 和对操作行为的说明;假如用面对对象的观点来分析银行账户问题,着重点在银行账户上,而不是在存款和取 款的行为上,那么,银行账户就是一个类; class BankAccount public:;void MakeDepositfloat amount float WithDrawfloat amount;bool TransferBankAccount&to,float amount3 / 13 名师归纳总结 - - - - - - -第 3 页,共 13 页精选学习资料 - - - - - - - - - private: float balance;float interestYTD; char*owner;int account_number; ;在 BankAccount 类中,说明的行为是MakeDeposit 、WithDraw 和 Transfer ;这些行为对于任何客户来说是很重要的,他们在银行开户的目的就是要进行存款、取款以及转账;正由于每一个顾客 作为类的实例 都可能做这些操作,所以对行为的说明是 public ,即公有的 ; 同 时 , 在 BankAecount 类 中 , 仍 说 明 了 数 据 balance 、 interestYTD、 owner 和account number,这些数据是私有的,只能在被定义的类中进行操作;作为银行账户类的实例,银行的每一个银行账户都是一个对象;每个银行账户对象有相同的结构和行为;因此,任何一个银行账户对象都可以使用在类中说明的 MakeDeposit 等操作,而且每个银行账户对象有相同类型的数据结构 balance 等;在面对对象程序设计中,一个类只在源程序的代码中显现,而并不会在一个正在内存运行的程序中显现,即类只是在编译时存在;对象作为类的实例在运行的程序中显现,并占有内存空间,它是在运行时存在的实体;所以一个类实际上是一种新的数据类型,当我们要用一个新的数据类型时,第一要在源程序中说明,而说明部分的代码是不在内存中运行的;在程序中运行的是该类的对象,对象在内存完成;注 意, 我们 在此 必需 严格 区分 说明 和定 义; 前面 我们 用 C+写 的程 序段 是对 类BankAccount 的说明;在 c+的类中,我们把那些行为称为 成员函数 ,而把数据称为 数据成员;122 对象的状态在面对对象程序设计中,对象是类的实例;对象给类以生命,类想要做的事必需通过建立对象和在对象上进行操作而实现;创建类的对象的过程也叫 实例化对象 ;对象知道什么能做和什么不能做,并且有才能修改和爱护定义在对象上的数据;可以将对象看成是一个带有状态和行为的活的实体;属于同一个类中的对象具有相同的行为,但是有各自独立的状态;什么是对象的状态.在现实世界中一个对象能独立存在的缘由是它们有各自的特点,这些特点就是对象的状态;对于一个人来说,姓名、性别、身高都是 其状态;在前面的争论中,对象的属性与对象的状态是相同的概念;这里,给对象的状态下一个 定义:对象的状态是全部静态属性和这些属性的动态值的总和;,以银行账户为例,BankAccount 类对象有一项数据成员 balance 余额 ;假设银行不允 许透支,那么每个账户的余额 balance 不应小于零;这是全部银行账户类对象的公共属性,也可以说是任何一个银行账户类对象的静态属性 ;这类属性是不需要检测的;然而,在 BankAccount 类对象的生存期的任何时刻,账户中的余额是包含在 balance 这个数据成员中的数值;当在对象上发生存款、转账、取款等行为时,会引起该数值的变化;因此,账户余额是一个动态变化的值,换句话说,数据成员 balance 的值是动态的 ;对象的状态通常不仅仅是初等的数据类型 整型、实型、字符型等 ,而且很多对象将另一个对象作为它们状态的一部分;例如,一辆车有发动机、车轮、座位,发动机是另外一个对象,它可以作为车的状态的一部分,;又例如,一个银行对象可以将银行账户对象和顾客对象作为它的状态的一部分;4 / 13 名师归纳总结 - - - - - - -第 4 页,共 13 页精选学习资料 - - - - - - - - - 一辆车 一个学校座位发动机座位同学同学座位车轮车轮车轮老师老师123 对象的交互现实世界中的对象不是孤立存在的实体,他们之间存在着各种各样的联系,正是它们之 间的相互作用、联系和连接,才构成了世间各种不同的系统;同样,在面对对象程序设计 中,对象之间也需要联系,我们称为 对象的交互 ;面对对象程序设计技术必需供应一种机 制,答应一个对象与另一个对象的交互;这种机制叫 消息传递 ;在面对对象程序设计中的消息传递,实际是对现实世界中的信息传递的直接模拟;一个 对象向另一个对象发出的恳求被称为“ 消息” ;消息是一个对象要求另一个对象执行某个功 能操作的规格的说明,通过消息传递才能完成对象之间的相互恳求或相互协作;例如,我们 有一个银行账户对象和一个顾客对象,顾客对象可以恳求银行账户对象的服务,如“ 存入 300 元” 、“ 取出 200 元” 等,当银行账户对象接到恳求后,确定应执行的相应的操作并执 行;在此,我们有必要介绍一下方法的概念;方法 是面对对象程序设计中的一个术语;我们 知道,属于一个类的对象具有相同的行为,当某个行为作用在对象时,我们就称对象执行了 一个方法;方法定义了一系列的运算步骤;所以,我们可以说一个对象恳求另一个对象执行 一个特定的方法,或者说一个对象发送一个消息给另一个对象,引起那个对象方法的执行;从这个意义上看,对象的行为是负责响应消息并进行操作;一般情形下,我们称发送消息的对象为发送者或恳求者,接收消息的对象为接收者或目标对象 ;对象中的联系只能通过消息传递来进行;接收者只有在接收到消息时,才能被 激活,被激活的对象会依据消息的要求完成相应的功能;消息具有三个性质: 1 同一个对象可以接收不同形式的多个消息,做出不同的响应; 2 相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的;消息的发送可以不考虑详细的接受者,对象可以响应消息,也可以不响应; 3 实际上,对象之间的消息传递机制对应于面对过程程序设计的过程调用;消息传递并 非真的传递信息,它的实质就是方法的调用;只不过方法的调用受到消息的掌握,而过程调 用是直接的;消息的内容一般应包括接收者的名字、恳求的方法、一个或多个参数;由发送者向接受者发送一条消息,就是要求调用特定的方法;所调用的方法可能引起 对象状态的转变,仍可能会生成更多的消息,而导致调用其它对象中的方法;在面对对象程序设计中,消息分为两类:公有消息和私有消息;假设有一批消息同属于一个对象,其中一部分消息是由其它对象直接向它发送的,称为5 / 13 公有消息 ;另一部分消名师归纳总结 - - - - - - -第 5 页,共 13 页精选学习资料 - - - - - - - - - 息是它向自己发送的,称为 私有消息 ;公有消息与私有消息的确定,与消息要求调用的方法有关;假如被调用的方法在对象所属的类中是在public下说明的,就为公有;是在private下说明的,即为私有;当然,私有消息只能发送调用属于它自己的方法;例如,一个银行账户对象的类定义是BankAccount ,一个顾客对象可以发送一个公有消息 WithDraw 给银行账户对象,要求取款;这个消息是公有消息;124 类的确定与划分我们知道,面对对象程序设计技术是将系统分解成如干对象,对象之间的相互作用构成 了整个系统;而类是创建对象的样板,在整体上代表一组对象,设计类而不是设计对象可以 防止重复的编码工作,类只需编码一次,就可以创建全部的对象;所以,当我们辑决实际问 题时,需要正确地进行分“ 类” ;我们必需懂得一个类到底表示的是哪一组对象,如何把实 际问题中的事物汇聚成一个个的“ 类” ,而不是一组数据;这是面对对象程序设计中的一个 难点;例如,考虑银行系统,我们至少应当有两类对象:顾客类和银行账户类;学校系统应至 少包含两类对象:同学和老师;如何确定和划分类.类的确定和划分并没有统一的标准和固定的方法,基本上依靠设计人员的体会、技巧以及对实际问题的把握;一个基本的原就是:寻求一个大系统中事物的共性,将具有共性的系统成分确定为一个类;这里以模拟一个学校系统为例;系统想要达到的目标不同,确定和划分的类就不相同;如模拟的目的是为了治理教案,设置的类可能是同学、老师、教材、课程、教室、图书等;如模拟的目的是治理后勤工作,设置的类可能是宿舍、食堂、后勤工作人员、教室、图书馆 等;确定一个事物是一个类的 第一步 ,是要判定它是否有一个以上的实例,假如有,就它 其次步 ,我们仍要判定类的实例中有否确定的不同点,假如没有,就它是 可能是一个类;一个类;由于类的每一个实例是相像的,具有相同的行为和属性结构;例如,颜色Color与鲜花联系在一起只是鲜花的一种状态,由于表示颜色的是一些值:红、黄、紫、白等,所以,在此 颜色运算的图形处理系统联系在一起,就Color 不是一个类;然而,假如我们把颜色同包括复杂 Color 是一个类,由于这时的颜色是基于颜色三元素 红、绿、蓝 的成分比例和色度的变量,它不仅仅是一个数值,仍可以附带很多的行为;不能把一组函数组合在一起构成类;也就是说,不能把一个面对过程的模块直接变成类;假如简洁地将模块中的函数变成成员函数而使其成为类是错误的;类不是函数的集合;例如,考虑一个包含一组数学函数的模块,现在我们定义一个类 Mathhelper : class Mathelper public: double sqrtdouble aNumber, double Powerdouble aNumber,int raiseto double Inversedouble aNumber; private:/ 任何数据项,也可能没有 ;确定 Mathelper 为一个类是错误的;问题在于该类中没有需要治理的私有数据;用户只需要供应参数对成员函数进行调用;这与面对过程的程序设计的函数调用没有根本的区分;设计类要有一个明确的目标;一个好的类应当是简洁懂得和使用的;我们不能设计一个6 / 13 名师归纳总结 - - - - - - -第 6 页,共 13 页精选学习资料 - - - - - - - - - Color类来表示鲜花的颜色,但是可以在图形处理系统中将颜色Color设计为类;由于在两个系统中对颜色的要求不同;13 数据的抽象与封装面对对象系统中最突出的特性是封装性、继承性和多态性;我们第一来争论封装性,封 装与数据抽象的概念亲密相关;131 现实世界中的抽象与封装抽象和封装的概念在现实世界中广泛存在,特别在科学技术日益进展的今日,大量的电 器被人们使用,对电器的使用表达了抽象与封装的概念;以录音机为例,录音机上有如干按键,当人们使用录音机时,只要依据自己的需要,如 放音、录音、停止、倒带等,按下与之对应的键,录音机就会完成相应的工作;这些按键安装在录音机的表面,人们通过它们与录音机交互;我们无法 当然也没必要 操作录音机的内部电路,由于它们被装在机壳里,录音机的内部情形对于用户来说是隐匿的,不行见的;这 就是所谓封装的原理;那么,我们是如何知道放音按哪个键,停止又按哪个键的呢.是录音机的操作说明书告诉我们的,但操作说明书并不告知我们录音机的内部将如何去做这些事;操作说明书在录音机做什么 what td do与怎样做 how to do之间做出了明确的区分;这就是所谓抽象的原理;抽象出来的是做什么,而不关怀如何实现这些操作;以一般观点而言,抽象是通过特定的实例或例子抽取共同性质以后形成概念的过程;抽 象是对系统的简化描述或规范说明,它强调了系统中的一部分细节和特性,例如做什么,而 忽视了其它部分,例如如何做;抽象的描述被称为它的规范说明,例如录音机的操作说明 书,而对抽象的说明称为它的实现;132 数据的抽象与封装的基本概念将上述观点用在数据结构上,就不难懂得数据的抽象与封装;将数据结构和作用于数据 结构上的操作组成一个实体,数据的表示方式和对数据的操作细节被隐匿起来,用户通过操 作接口对数据进行操作;对于用户来说,只知道如何通过操作接口对该数据进行操作,而并 不知道是如何做的也不知道数据是如何表示的;这就是 数据的封装 ;数据的抽象 就是通过对数据实例的分析,抽取其共同性质的结果;数据的抽象和我们前面 争论的类的概念之间明显存在着很强的相像性;在面对对象程序设计中,数据的抽象是在确定类时强调对象的共同点而忽视它们的不同点的 结果;也可以说,在一个类的说明中我们只表示那些主要特性,而忽视次要的、引不起我们 爱好的东西;数据的封装 就是隐匿了抽象的内部实现细节的结果;封装是将数据抽象的外部接口与内部 的实现细节清晰地分别开;抽象和封装是互补的;好的抽象有利于封装,封装的实体就帮忙 爱护抽象的完整性;重要的是抽象先于封装;以银行账户类为例,balance 、interestYTD、owner、account number 等私有数据是被封装的数据, MakeDeposit 、WithDraw 、Transfer等成员函数的细节也同时被封装,用户看到的是 MakeDeposit 、WithDraw 、Transfer 操作供应的接口;7 / 13 名师归纳总结 - - - - - - -第 7 页,共 13 页精选学习资料 - - - - - - - - - 接口 实现细节(不行见)Balance InterestYTD Owner MakeDeposit account number 用户不能存取的数据WithDraw MakeDeposit Transfer WithDraw Transfer 在上面的争论中,我们并没有严格区分银行账户是类仍是对象,由于封装性不仅涉及到 类的描述,也涉及到组成软件系统的对象;从类的实例 对象 的角度来争论封装好像更合理,由于类并不真正占有储备空间;封装的单位实际是对象,但是对象的结构和行为是用它自己的类说明来描述的;对象的封装 比类的封装更详细化;可以从下面几点来懂得对象的封装: 1 对象具有一个清晰的边界,对象的私有数据、成员函数的细节被封装在该边界内; 2 具有一个描述对象与其它对象如何相互作用的接口,该接口必需说明消息传递的使 用方法;, 3 对象内部的代码和数据应受到爱护,其它对象不能直接修改;从用户 或应用程序员 的观点看,对象供应了一组服务,并供应了恳求服务的接口;从 系统设计员的角度看,封装能清晰地标明对象供应的服务界面,而水乡的行为和数据是隐匿 的,不行见;对象的这一封装机制,可以将对象的使用者和设计者分开;133 对象的特性(1)封装性;(2)模块的独立性;(3)动态连接性;(4)易爱护性8 / 13 名师归纳总结 - - - - - - -第 8 页,共 13 页精选学习资料 - - - - - - - - - 1 4继承性141 继承的概念哺乳动物孩 子 的 父 母热血、有毛发、用奶培育幼子狗有犬牙、食肉、特定的骨骼结构、群居孩子柯利狗尖鼻子、身体颜色红白相间、适合放牧上图说明白哺乳动物、狗、柯利狗之间的继承关系;图中箭头方向志向基对象;哺乳动物是一种热血、有毛发、用奶培育幼仔的动物;狗是有犬牙、食肉、特定的骨骼结构、群居的哺乳动物;柯利狗是尖鼻子、身体颜色红白相闻、适合放牧的狗;在继承链中,每个类继承了它前一个类的全部特性;例如,狗具有哺乳动物的全部特性,同时仍具有区分于其它哺乳动物 如猫、大象等 的特点;图中从下到上的继承关系是:柯利狗是狗,狗是哺乳动物;“ 柯利狗” 类继承了“ 狗” 类的特性,“ 狗” 类继承了“ 哺乳动物” 类的特性;以面对对象程序设计的观点来看,继承所表达的是对象类之间相关的关系;这种关系使得某类对象可以继承另外一类对象的特点和才能;如类之间具有继承关系就它们之间具有以下几个特性: 1 类间具有共享特点 包括数据和程序代码的共享 ; 2 类间具有差别或新增部分 包括非共享的数据和程序代码 ; 3 类间具有层次结构;假设有两个类 A和 B,如类 B 继承类 A,就属于类 B 中的对象具有类 A 的一切特点 包括数据属性和操作 ,这时,我们称被继承类 A 为基类或父类或超类;而称继承类 B 为类 A 的派生类或子类 ;同时,我们仍可以说,类B 是从类 A中派生出来的;假如类 B 从类 A派生出来,而类 C又是从类 B 派生出来的,就构成了类的层次;这样,我们又有了直接基类和间接基类的概念;类A 是类 B 的直接基类 ,是类 c 的间接基类 ;类 c不但继承它的直接基类的全部特性,仍继承它的全部间接基类的特点;对于动物继承链,用面对对象程序设计的术语,我们称“ 哺乳动物” 是“ 狗” 的基类,“ 狗” 是“ 哺乳动物” 的派生类;“ 哺乳动物” 、“ 狗” 、“ 柯利狗” 构成类的层次;“ 哺乳动物” 是“ 狗” 的直接基类,是“ 柯利狗” 的间接基类;假如类 B 是类 A 的派生类,那么,在构造类 B 的时候,我们不必重新描述 A 的全部特征,我们只需让它继承类 A 的特点,然后描述与基类 A 不同的那些特性;也就是说,类 B 的特点由继承来的和新添加的两部分特点构成;详细地说,继承机制答应派生类继承基类的数据和操作 即数据成员和成员函数 ,也就是说,答应派生类使用基类的数据和操作;同时,派生类仍可以增加新的操作和数据;例9 / 13 名师归纳总结 - - - - - - -第 9 页,共 13 页精选学习资料 - - - - - - - - - 如,子女类可以从父母类继承房子和汽车,当然可以使用房子和汽车,仍可以对房子进行再 装修;继承的作用有两个:其一,防止公用代码的重复开发,削减代码和数据冗余;其二,通过增强一样性来削减模块间的接口和界面;继承使程序不再是毫无关系的类的堆砌,而具有良好的结构;继承机制为程序员们供应了一种组织、构造和重用类的手段;继承使一个类 基类 的数据结构和操作被另一个类 派生类 重用,在派生类中只需描述其基类中没有的数据和操作;这样,就防止了公用代码的重复开 发,增加了程序的可重用性,削减了代码和数据冗余;同时,在描述派生类时,程序员仍可 以掩盖基类的一些操作,或修改和重定义基类中的操作,例如子女对所继承的房子进行装 修;继承机制以相关的关系来组织事物,可以削减我们对相像事物进行说明和记忆的规模,为我们供应了一种简化的手段;程序员可以将相关的类收集在一起,生成高一级的、概括了 这些类的共性的类;具有适应关系的类处于一个继承层次结构中,高层的类作为低层的类的 抽象,使程序员能够忽视那些低层类的不同实现细节,而依据高层类编写通用程序,并且在 把握了高层类的特点以后,能够很快地把握低层类的特点,给编程工作带来便利;142 继承的分类继承有两种分类方法,一种是从继承源上分,另一种是从继承内容上分;从继承源上分,继承分为单继承和多继承;单继承是指每个派生类只直接继承了一个基类的特点;前面介绍的动物链,就是一个单继承的实例;图15 也表示了一种单继承关系,即Windows 操作系统的窗口之间的继承关系;单继承并不能解决继承中的全部问题,例如,小孩喜爱的玩具车既继承了车的一些特性,又继承了玩具的一些特点,如图1 6 所示;此时 “ 玩具车 ” 类不是继承了一个基类的特性,而是继承了“ 玩具 ” 和“ 车” 两个基类的特性,这是一种多继承的关系;多继承是指多个基类派生出一个派生类的继承关系,多继承的派生类直接继承了不止一 个基类的特点;从继承内容上划分,继承可分为取代继承、包含继承、受限继承、特化继承;取代继承:例如徒弟从师傅那里学到的全部技术,在任何需要师傅的地方都可以由徒弟 来替代,这就属于取代继承;包含继承:例如“ 柯利狗” 继承了“ 狗” 的全部特点,任何一条“ 柯利狗” 都是一条“ 狗” ,这就属于包含继承;受限继承:例如“ 鸵鸟” 尽管继承了“ 鸟” 的一些特点,但不能继承鸟会飞的特点,这 就属于受限继承;特化继承:例如“ 运动员” 是一类特别的人,比一般人具有更多体育特长,这就属于特 化继承;143 继承与封装的关系在面对对象程序设计中,对象具有封装性,对象之间的联系只能通过消息传递来完成,对象的私有数据和行为是被隐匿起来的;那么,继承机制的引入是否减弱了封装性 .继承与10 / 13 名师归纳总结 - - - - - - -第 10 页,共 13 页精选学习资料 - - - - - - - - - 封装是否产生冲突 .回答是否定的;继承与封装不但投有实质性的冲突,而且仍有肯定的相 似性;在面对对象系统中,封装的单位是对象,也就是说,把一个属于某一类的对象封装起 来,使其数据和操作成为一个整体;假如该对象所属的类是一个派生类,那么,它只要把从 基类那里继承来的操作和数据与自己的操作和数据一并封装起来,就可以了;对象依旧是封 装好的整体,仍旧只通过消息传递与其它的对象交互,而不是直接调用;所以,一个对象,无论它是基类的实例,仍是派生类的实例,都是一个被封装的实体;因此,我们得出结论:继承机制的引入并不影响对象的封装性;从另一角度看,继承与封装仍有相像性,那就是它们都供应了共享代码的手段,因而增 加了代码的重用性;继承供应的代码共享是静态的,派生类对象在成为活动的实体以后,自动地共享其基类 中定义的代码段,从而使基类对象与其派生类对象共享一段代码;封装供应的代码共享是动态的,例如我们在一个类中说明白一段代码,那么属于该类的 多个实例在程序运行时共享在类中说明的那段代码;15 多态性151 什么是多态性多态性也是面对对象系统的重要特性;在争论面对对象程序设计的多态性之前,我们仍 是来看看现实世界的多态性;现实世界的多态性在自然语言中常常显现;假设一辆汽车停在 了属于别人的车位,司机可能会听到这样的要求:“ 请把你的车挪开” ,司机在听到恳求 后,所做的工作应当是把车开走;在家里,一把凳子拦住了孩子的去路,他可能会恳求妈 妈:“ 请把凳子挪开” ,妈妈过去搬起凳子,放在一边;在这两件事情中,司机和妈妈的工 作都是“ 挪开” 一样东西,但是他们在听到恳求以后的行为是截然不同的,这就是多态性;对于 “ 挪开 ” 这个恳求,仍可以有更多的行为与之对应;于用的对象不同,操作的方法就不同;面对对象程序设计借鉴了现实世界的多态性;“ 挪开 ” 从字面上看是相同的,但由面对对象系统的多态性是指不同的对象收到相同的的消息时产生多种不同的行为方式;例如,我们有一个窗口Window 类对象,仍一个棋子 ChessPiece 类对象,现在我们来考虑对它们都发出“ 移动” 的消息,“ 移动”操作在 Window类对象和 ChessPiece 类对象上可以有不同的行为; c+ 语言支持两种多态性,即编译时的多态性和运行时的多态性;编译时的多态性 是通过重载来实现的,我们将在 15 2 介绍其概念;运行时的多态性 是通过虚函数来实现的,程序运行的到底是哪个函数版本,需要在运行时通过对象发送的消息来确定;由于虚函数的概念略为复杂,并且涉及到152 重载的概念重载一般包括函数重载和运算符重载c+的语法细节,在此不做进一步的争论;函数重载是指一个标识符可同时用于为多个函数命名,而运算符重载是指一个运算符可同时用于多种运算;也就是说,相同名字的函数或运算 符在不同的场合可以表现出不同的行为;下面我们给出一个函数重载的例子; class A public:11 / 13 名师归纳总结 - - - - - - -第 11 页,共 13 页精选学习资料 - - - - - - - - - void Printint i 语句段 1; void Printfloat f 语句段 2; void Printconst char*c 语句段 3; 其它语句 ;在上面的类定义中我们重载了三个函数,名字都是 Print;它们有各自不同的功能,分别用语旬段 1

    注意事项

    本文(2022年第章面向对象程序设计概述.docx)为本站会员(Q****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开