第八讲 面向对象的软件工程_第1页
第八讲 面向对象的软件工程_第2页
第八讲 面向对象的软件工程_第3页
第八讲 面向对象的软件工程_第4页
第八讲 面向对象的软件工程_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第八讲第八讲 面向对象的软件工程面向对象的软件工程中南大学中南大学 信息科学与工程学院信息科学与工程学院王随平王随平2讲解纲要讲解纲要p一、传统与面向对象的开发方法一、传统与面向对象的开发方法p二、面向对象的基本概念二、面向对象的基本概念p三、面向对象建模与三、面向对象建模与UMLUMLp四、面向对象的分析与设计四、面向对象的分析与设计p五、面向对象的实现五、面向对象的实现p六、技术前沿六、技术前沿3一、传统与面向对象的开发方法一、传统与面向对象的开发方法本质本质l本质本质:开发工作开始之前,通过需求分析开发工作开始之前,通过需求分析预先定义软件预先定义软件需求需求,然后分阶段有条不紊地开发

2、,实现用户需求。,然后分阶段有条不紊地开发,实现用户需求。l生命周期方法学是一个巨大的进步,对实现软件开发工程生命周期方法学是一个巨大的进步,对实现软件开发工程化曾经起了重要的促进作用,部分地缓解了软件危机。但化曾经起了重要的促进作用,部分地缓解了软件危机。但实践表明,传统的生命周期方法学并实践表明,传统的生命周期方法学并不能完全消除软件危不能完全消除软件危机机。l对某些类型的软件开发较适用对某些类型的软件开发较适用,对另一些类型的软件则可,对另一些类型的软件则可能完全不适用。能完全不适用。l近年来软件工程的新途径近年来软件工程的新途径快速原型法和面向对象方法快速原型法和面向对象方法学学已经进

3、入实用阶段,应用得越来越广泛。已经进入实用阶段,应用得越来越广泛。p 传统的生命周期方法学传统的生命周期方法学 4一、传统与面向对象的开发方法一、传统与面向对象的开发方法要点要点l面向对象方法学的出发点和基本原则面向对象方法学的出发点和基本原则尽可能尽可能模拟人类习惯的思维方式模拟人类习惯的思维方式,使开发软件的方法与,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程;过程尽可能接近人类认识世界解决问题的方法与过程;也就是使描述问题的也就是使描述问题的问题空间(也称为问题域)问题空间(也称为问题域)与实现与实现解法的解法的解空间(也称为求解域)解空间(也称为求解域)在结构上尽可

4、能一致。在结构上尽可能一致。p 面向对象方法学的要点面向对象方法学的要点5p 问题空间问题空间l客观世界的问题都是由客观世界中的客观世界的问题都是由客观世界中的实体及实体间相互间的关系构实体及实体间相互间的关系构成成的。的。l把客观世界中的一个实体抽象为问题域中的把客观世界中的一个实体抽象为问题域中的对象(对象(Object)。)。l从动态观点看,对对象施加的操作就是该从动态观点看,对对象施加的操作就是该对象的行为对象的行为。l通常,客观世界中的实体既具有通常,客观世界中的实体既具有静态的属性又具有动态的行为静态的属性又具有动态的行为。 一、传统与面向对象的开发方法一、传统与面向对象的开发方法

5、概念概念l计算机中的实体称为计算机中的实体称为解空间的对象解空间的对象,显然,解空间的对象取决于所,显然,解空间的对象取决于所使用的程序设计语言。使用的程序设计语言。例如,汇编语言提供的对象是存储单元;面向过程的高级语言例如,汇编语言提供的对象是存储单元;面向过程的高级语言提供的对象,是各种预定义类型的变量、数组、记录和文件等。提供的对象,是各种预定义类型的变量、数组、记录和文件等。l这些这些解空间对象实质上仅仅是描述实体属性的数据解空间对象实质上仅仅是描述实体属性的数据,必须在程序中,必须在程序中从外部对它施加操作,才能模拟它的行为。从外部对它施加操作,才能模拟它的行为。p 解空间解空间6p

6、 传统方法中问题空间和解空间的映射关系传统方法中问题空间和解空间的映射关系l在问题空间中(即客观世界中的实体)既具有静态的属性又具有动在问题空间中(即客观世界中的实体)既具有静态的属性又具有动态的行为。态的行为。l在解空间中,在解空间中,传统方法把数据(静态的属性)和处理(动态的行为)传统方法把数据(静态的属性)和处理(动态的行为)人为地分离成两个独立的部分,这使得描述问题的问题空间(也称人为地分离成两个独立的部分,这使得描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上不一致为问题域)与实现解法的解空间(也称为求解域)在结构上不一致。l增加了软件开发的难度。增加了软

7、件开发的难度。 一、传统与面向对象的开发方法一、传统与面向对象的开发方法-映射映射7p 面向对象方法中问题空间和解空间的映射关系面向对象方法中问题空间和解空间的映射关系l尽可能模拟客观世界,它尽可能模拟客观世界,它把数据以及在这些数据上的操作所构成把数据以及在这些数据上的操作所构成的统一体称为的统一体称为“对象对象”。l对象是进行处理的主体对象是进行处理的主体。必须发消息请求对象执行它的某些操作,。必须发消息请求对象执行它的某些操作,处理它的私有数据,而不能从外界直接对它的私有数据进行操作。处理它的私有数据,而不能从外界直接对它的私有数据进行操作。l可以根据问题空间的结构,定义或选取解空间对象

8、,然后用一系可以根据问题空间的结构,定义或选取解空间对象,然后用一系列离散的解空间对象的集合组成软件系统。对象彼此间通过发送列离散的解空间对象的集合组成软件系统。对象彼此间通过发送消息而相互作用,从而得出问题的解。消息而相互作用,从而得出问题的解。l面向对象是一种新的思维方法,它面向对象是一种新的思维方法,它不是把程序看作是工作在数据不是把程序看作是工作在数据上的一系列过程或函数的集合,而是把程序看作是相互协作而又上的一系列过程或函数的集合,而是把程序看作是相互协作而又彼此独立的对象的集合彼此独立的对象的集合。l在许多系统中解空间对象都可以直接模拟问题空间的对象,在许多系统中解空间对象都可以直

9、接模拟问题空间的对象,解空解空间与问题空间的结构十分一致间与问题空间的结构十分一致,程序易于理解和维护。,程序易于理解和维护。一、传统与面向对象的开发方法一、传统与面向对象的开发方法-映射映射8问题域问题域需求分析需求分析总体设计总体设计详细设计详细设计编程编程测试测试计算机计算机分析与设计鸿沟分析与设计鸿沟传统的软件工程方法传统的软件工程方法问题域问题域面向对象面向对象分析分析面向对象面向对象设计设计面向对象面向对象编程编程面向对象面向对象测试测试计算机计算机面向对象的软件工程方法面向对象的软件工程方法一、传统与面向对象的开发方法一、传统与面向对象的开发方法-比较比较9p 面向对象方法的四个

10、要点面向对象方法的四个要点 1.认为认为客观世界是由各种对象组成客观世界是由各种对象组成的,任何事物都是对象;复杂的对的,任何事物都是对象;复杂的对象可以由比较简单的对象以某种方式组合而成。象可以由比较简单的对象以某种方式组合而成。因此,因此,面向对象的软件系统是由各种对象组成的面向对象的软件系统是由各种对象组成的;任何元素都是对象,复杂的对象可以由比较简单的对象某种方式组合任何元素都是对象,复杂的对象可以由比较简单的对象某种方式组合而成。而成。一、一、传统与面向对象的开发方法传统与面向对象的开发方法2.把所有对象都划分成各种把所有对象都划分成各种对象类(简称为类对象类(简称为类Class),

11、),每个每个对象类对象类都定义了一组数据和一组方法都定义了一组数据和一组方法。数据用于表示对象的静态属性,是对象的状态信息数据用于表示对象的静态属性,是对象的状态信息。每当建立该对象类的一个新实例时,就按照类中对数据的定义为这个每当建立该对象类的一个新实例时,就按照类中对数据的定义为这个新对象生成一组专用的数据,以便描述该对象独特的属性值。新对象生成一组专用的数据,以便描述该对象独特的属性值。类中定义的类中定义的方法,是允许施加于该类对象上的操作方法,是允许施加于该类对象上的操作,是该类所有对象,是该类所有对象共享的,并不需要为每个对象都复制操作的代码。共享的,并不需要为每个对象都复制操作的代

12、码。103.按照按照子类(或称为派生类)与父类(或称为基类)子类(或称为派生类)与父类(或称为基类)的关系,把若的关系,把若干个对象类组成一个层次结构的系统(也称为干个对象类组成一个层次结构的系统(也称为类等级类等级)。)。派生类具有基类的特性(包括数据和方法),但是派生类又派生类具有基类的特性(包括数据和方法),但是派生类又有某些基类没有的特性。有某些基类没有的特性。这种现象称为这种现象称为继承(继承(Inheritance)。)。一、传统与面向对象的开发方法一、传统与面向对象的开发方法4.对象彼此之间仅能通过传递消息互相联系对象彼此之间仅能通过传递消息互相联系。对象是进行处理的主体,必须发

13、消息请求它执行它的某个操对象是进行处理的主体,必须发消息请求它执行它的某个操作,处理它的私有数据,而不能从外界直接对它的私有数据作,处理它的私有数据,而不能从外界直接对它的私有数据进行操作。进行操作。也就是说,该对象的私有信息,都被封装在该对象类的定义也就是说,该对象的私有信息,都被封装在该对象类的定义中,这就是中,这就是“封装性封装性”。11p 面向对象方法学方程面向对象方法学方程 lOO Objects + Classes + Inheritance + Communication with messagesl也就是说,面向对象就是既使用也就是说,面向对象就是既使用对象对象又使用又使用类类

14、和和继承继承等机制,而且对象之间仅能通过传递等机制,而且对象之间仅能通过传递消息消息实现彼此通实现彼此通信。信。 一、传统与面向对象的开发方法一、传统与面向对象的开发方法-方程方程12p 面向对象方法的主要优点面向对象方法的主要优点l与人类习惯的思维方法一致与人类习惯的思维方法一致面向过程的设计方法:面向过程的设计方法:l以算法为核心,把数据和过程作为相互独立的部分。以算法为核心,把数据和过程作为相互独立的部分。面向对象的设计方法:面向对象的设计方法:l以对象为核心,开发出的软件系统由对象组成。以对象为核心,开发出的软件系统由对象组成。l对象之间通过传递消息互相联系,以模拟现实世界中不同对象之

15、间通过传递消息互相联系,以模拟现实世界中不同事物彼此之间的联系。事物彼此之间的联系。一、传统与面向对象的开发方法一、传统与面向对象的开发方法-后者优点后者优点13l稳定性好稳定性好面向过程的设计方法:面向过程的设计方法:l以算法为核心,开发过程基于功能分析和功能分解。软以算法为核心,开发过程基于功能分析和功能分解。软件系统的结构紧密依赖于系统所要完成的功能,当功能件系统的结构紧密依赖于系统所要完成的功能,当功能需求发生变化时将引起软件结构的整体修改。需求发生变化时将引起软件结构的整体修改。面向对象的设计方法:面向对象的设计方法:l以对象为中心构造软件系统。用对象模拟问题领域中的以对象为中心构造

16、软件系统。用对象模拟问题领域中的实体,以对象间的联系刻画实体间的联系。当系统的实体,以对象间的联系刻画实体间的联系。当系统的功功能需求变化时,往往只需要作一些局部性的修改能需求变化时,往往只需要作一些局部性的修改。这样。这样的软件系统比较稳定。的软件系统比较稳定。p 面向对象方法的主要优点面向对象方法的主要优点一、传统与面向对象的开发方法一、传统与面向对象的开发方法-后者优点后者优点14l可重用性好可重用性好传统的软件重用技术:传统的软件重用技术:l用用标准函数库中的函数作为标准函数库中的函数作为“预制件预制件”来建造新的软件来建造新的软件系统。但标准函数缺乏必要的系统。但标准函数缺乏必要的“

17、柔性柔性”,不能适应不同,不能适应不同的应用场合,不是理想的可重用的软件成分。的应用场合,不是理想的可重用的软件成分。面向对象的设计方法:面向对象的设计方法:l重用一个对象类有两种方法,一种方法是创建该类的实重用一个对象类有两种方法,一种方法是创建该类的实例,从而直接使用它;另一种方法是从它派生出一个满例,从而直接使用它;另一种方法是从它派生出一个满足当前需要的新类足当前需要的新类。继承性机制使得子类不仅可以重用。继承性机制使得子类不仅可以重用其父类的数据结构和程序代码,而且可以在父类代码的其父类的数据结构和程序代码,而且可以在父类代码的基础上方便地基础上方便地修改和扩充修改和扩充,这种修改并

18、不影响对原有类,这种修改并不影响对原有类的使用。的使用。p 面向对象方法的主要优点面向对象方法的主要优点一、传统与面向对象的开发方法一、传统与面向对象的开发方法-后者优点后者优点15l较易开发大型软件产品较易开发大型软件产品可以将大系统分解成相互独立的小产品来处理可以将大系统分解成相互独立的小产品来处理可以降低成本,提高质量可以降低成本,提高质量l可维护性好可维护性好面向对象的软件面向对象的软件稳定稳定性比较好。性比较好。面向对象的软件比较容面向对象的软件比较容易修改易修改。面向对象的软件比较容面向对象的软件比较容易理解易理解。易于测试和调试易于测试和调试。p 面向对象方法的主要优点面向对象方

19、法的主要优点一、传统与面向对象的开发方法一、传统与面向对象的开发方法-后者优点后者优点16讲解纲要讲解纲要p一、传统与面向对象的开发方法一、传统与面向对象的开发方法p二、面向对象的基本概念二、面向对象的基本概念p三、面向对象建模与三、面向对象建模与UMLUMLp四、面向对象的分析与设计四、面向对象的分析与设计p五、面向对象的实现五、面向对象的实现p六、技术前沿六、技术前沿17二、面向对象的基本概念二、面向对象的基本概念p对象(对象(Object)p类(类(Class)p实例(实例(Instance)p消息(消息(Message)p方法(方法(Method)p属性(属性(Attribute)p继

20、承(继承(Inheritance)p重载(重载(Overload)p多态性(多态性(Polymorphism)18二、面向对象的基本概念二、面向对象的基本概念-对象对象l对象是人们要进行研究的对象是人们要进行研究的任何事物任何事物,从最简单的整数,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。事物,还能表示抽象的规则、计划或事件。l现实世界中对象有现实世界中对象有两个共同的特点两个共同的特点:一方面,它们都有自己的一方面,它们都有自己的状态状态,如一台电视机有自,如一台电视机有自己的摆放位置,有关

21、机和开机状态,此刻正在播放己的摆放位置,有关机和开机状态,此刻正在播放某一频道的电视节目等某一频道的电视节目等另一方面,它们又都有自己的另一方面,它们又都有自己的行为或功能行为或功能,如电视,如电视机的开机、关机、调台等。机的开机、关机、调台等。19二、面向对象的基本概念二、面向对象的基本概念-对象对象l对象是由描述该对象是由描述该对象属性的数据以及可以对这些数据施对象属性的数据以及可以对这些数据施加的所有操作封装在一起构成的统一体加的所有操作封装在一起构成的统一体,这个封装体有,这个封装体有可以唯一地标识它的可以唯一地标识它的名字名字。对象具有状态,一个对象可用对象具有状态,一个对象可用数据

22、值来描述它的状态数据值来描述它的状态;对象还有操作,用于改变对象的状态,是对象的行为;对象还有操作,用于改变对象的状态,是对象的行为;对象实现了数据和操作的结合,使数据和操作封装于对对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中,而且可以向外界提供一组服务。象的统一体中,而且可以向外界提供一组服务。20对象的形象表示对象的形象表示l使用对象时只需知道它向使用对象时只需知道它向外界提供的接口形式而外界提供的接口形式而无无须知道它的内部实现算法须知道它的内部实现算法。l对象内部的数据只能通过对象内部的数据只能通过对象的公有方法来访问或对象的公有方法来访问或处理,保证了对这些数据处理,

23、保证了对这些数据的访问或处理,在任何时的访问或处理,在任何时候都是使用候都是使用统一的方法统一的方法进进行的行的l使用简单、方便,高的安使用简单、方便,高的安全性和可靠性。全性和可靠性。l思考:录音机对象有唯一思考:录音机对象有唯一可以标识它的名字么?可以标识它的名字么?录音机21二、面向对象的基本概念二、面向对象的基本概念-对象的特点对象的特点l以数据为中心。以数据为中心。l对象是主动的。对象是主动的。l实现了数据封装。实现了数据封装。l本质上具有并行性。本质上具有并行性。l模块独立性好。模块独立性好。22二、面向对象的基本概念二、面向对象的基本概念- 类(类(Class)l人类习惯于把有相

24、似特征的事物归为一类,分类是人类认识客观人类习惯于把有相似特征的事物归为一类,分类是人类认识客观世界的基本方法。世界的基本方法。l在面向对象的软件技术中,把具有在面向对象的软件技术中,把具有相同数据和相同操作的一组相相同数据和相同操作的一组相似对象也归为一似对象也归为一“类类”。 三个圆心位置、半径大小和颜色均不相同的圆,是三个不同三个圆心位置、半径大小和颜色均不相同的圆,是三个不同的对象;的对象;但是,它们都有相同的数据(圆心坐标、半径、颜色)和相但是,它们都有相同的数据(圆心坐标、半径、颜色)和相同的操作(显示自己、放大缩小半径、在屏幕上移动位置,同的操作(显示自己、放大缩小半径、在屏幕上

25、移动位置,等等)。等等)。因此,它们是同一类事物,可以用因此,它们是同一类事物,可以用“Circle类类”来定义。来定义。23二、面向对象的基本概念二、面向对象的基本概念- 实例(实例(Instance)l实例就是实例就是由某个特定的类所描述的一个具体的对象由某个特定的类所描述的一个具体的对象。类是对具有相同属性和行为的一组相似的对象的抽类是对具有相同属性和行为的一组相似的对象的抽象,类在现实世界中并不能真正存在。象,类在现实世界中并不能真正存在。在地球上并没有抽象的在地球上并没有抽象的“中国人中国人”,只有一个个具,只有一个个具体的中国人,例如,张三、李四、王五体的中国人,例如,张三、李四、

26、王五l实际上实际上类是建立对象时使用的类是建立对象时使用的“模板模板”;l按照这个模板所建立的按照这个模板所建立的一个个具体的对象,就是类的一个个具体的对象,就是类的实际例子,通常称为实例实际例子,通常称为实例。 l如果将对象比作房子,那么类就是房子的设计图纸。如果将对象比作房子,那么类就是房子的设计图纸。所以面向对象程序设计的重点是所以面向对象程序设计的重点是类的设计类的设计,而不是对,而不是对象的设计象的设计24二、面向对象的基本概念二、面向对象的基本概念- 消息(消息(Message)l消息是要求消息是要求某个对象执行在定义它的那个类中所定义的某个操作某个对象执行在定义它的那个类中所定义

27、的某个操作的规格说明。的规格说明。l一个消息由下述一个消息由下述三部分组成三部分组成:接收消息的对象;接收消息的对象;消息选择符(也称为消息名);消息选择符(也称为消息名);零个或多个变元。零个或多个变元。MyCircle是一个半径是一个半径4cm、圆心位于(、圆心位于(100,200)的)的Circle类类的对象,也就是的对象,也就是Circle类的一个实例。类的一个实例。当要求它以绿颜色在屏幕上显示自己时,在当要求它以绿颜色在屏幕上显示自己时,在C+语言中应该语言中应该向它发下列消息:向它发下列消息: MyCircle.Show(GREEN);25二、面向对象的基本概念二、面向对象的基本概

28、念- 方法方法(Method)l对象所能执行的操作对象所能执行的操作,也就是,也就是类中所定义的服务类中所定义的服务。l方法方法描述了对象执行操作的算法描述了对象执行操作的算法,响应消息的方法。,响应消息的方法。在在C+语言中把方法称为成员函数。语言中把方法称为成员函数。例如,为了例如,为了Circle类的对象能够响应让它在屏幕上显示类的对象能够响应让它在屏幕上显示自己的消息自己的消息Show(GREEN),在),在Circle类中必须给出类中必须给出成员函数成员函数Show(int color)的定义,也就是要给出这个)的定义,也就是要给出这个成员函数的实现代码。成员函数的实现代码。26二、

29、面向对象的基本概念二、面向对象的基本概念- 属性(属性(Attribute)l类中所定义的数据类中所定义的数据,它是对客观世界实体所具有的性,它是对客观世界实体所具有的性质的抽象。质的抽象。l类的类的每个实例都有自己特有的属性值每个实例都有自己特有的属性值。在在C+语言中把属性称为数据成员。语言中把属性称为数据成员。例如,例如,Circle类中定义的代表圆心坐标、半径、颜色等类中定义的代表圆心坐标、半径、颜色等的数据成员,就是圆的属性。的数据成员,就是圆的属性。27二、面向对象的基本概念二、面向对象的基本概念- 一个完整的定义一个完整的定义从现实世界中每个圆都具有圆心坐标、半径、颜色等特点,可

30、以抽象出圆类,从现实世界中每个圆都具有圆心坐标、半径、颜色等特点,可以抽象出圆类,它由数据和服务(操作)组成;它由数据和服务(操作)组成;现实存在的那些圆称为类的对象;每一个具体现实存在的那些圆称为类的对象;每一个具体的圆称为一个实例;的圆称为一个实例;每个实例都有特有的属性值;类的服务是对象所能执行的每个实例都有特有的属性值;类的服务是对象所能执行的操作,是所有实例所共有的;操作,是所有实例所共有的;对象对象圆心坐标圆心坐标=(1,5),半径半径=2,颜色颜色=Red圆类圆类 数据:数据: int 2 圆心坐标;圆心坐标; int 半径;半径; int 颜色;颜色;服务(操作):服务(操作)

31、:Show(颜色颜色)抽象出抽象出抽象出抽象出抽象出抽象出属性属性实例化实例化圆心坐标圆心坐标=(1,1),半径半径=1,颜色颜色=Green圆心坐标圆心坐标=(1,5),半径半径=4,颜色颜色=Yellow实例实例实例实例实例实例28二、面向对象的基本概念二、面向对象的基本概念- 一个完整的定义一个完整的定义对象对象圆心坐标圆心坐标=(1,5),半径半径=2,颜色颜色=Red圆类圆类 数据:数据: int 2 圆心坐标;圆心坐标; int 半径;半径; int 颜色;颜色;服务(操作):服务(操作):Show(颜色颜色)抽象出抽象出抽象出抽象出抽象出抽象出属性属性实例化实例化圆心坐标圆心坐标

32、=(1,1),半径半径=1,颜色颜色=Green圆心坐标圆心坐标=(1,5),半径半径=4,颜色颜色=Yellow实例实例实例实例实例实例当要求某个对象执行类所能提供的服务(操作)时,需当要求某个对象执行类所能提供的服务(操作)时,需要给该对象发送一个消息;例:要给该对象发送一个消息;例:“圆圆1”,当进行,当进行Show(颜颜色色)这个操作,把自己变成绿色,并显示时,可发送消息:这个操作,把自己变成绿色,并显示时,可发送消息:圆圆1.Show(绿色绿色);因此,面向对象的消息机制实际上类似于我们在面向过因此,面向对象的消息机制实际上类似于我们在面向过程的开发中的程的开发中的函数调用机制函数调

33、用机制,对象名对象名.函数名函数名(函数参数函数参数)。而而Windows的消息机制实际上只是一种的消息机制实际上只是一种消息队列的调度消息队列的调度机制机制,与面向对象的消息机制无任何关系;,与面向对象的消息机制无任何关系;29二、面向对象的基本概念二、面向对象的基本概念-封装封装(encapsulation)l定义:定义:把数据和实现操作的代码集中起来放在对象内部。对外部,把数据和实现操作的代码集中起来放在对象内部。对外部,表示对象状态的数据和实现操作的代码与局部数据都不可见,更表示对象状态的数据和实现操作的代码与局部数据都不可见,更不能从外面直接访问或修改这些数据和代码不能从外面直接访问

34、或修改这些数据和代码。l对象具有封装性的条件如下:对象具有封装性的条件如下:(1)有一个清晰的边界有一个清晰的边界。所有私有数据和实现操作的代码都被封。所有私有数据和实现操作的代码都被封装在这个边界内,从外面看不见更不能直接访问。装在这个边界内,从外面看不见更不能直接访问。(2)有确定的接口有确定的接口(即协议即协议)。这些接口就是对象可以接受的消息,。这些接口就是对象可以接受的消息,只能通过向对象发送消息来使用它。只能通过向对象发送消息来使用它。(3)受保护的内部实现受保护的内部实现。实现对象功能的细节。实现对象功能的细节(私有数据和代码私有数据和代码)不能在定义该对象的类的范围外访问。不能

35、在定义该对象的类的范围外访问。30类声明的一般格式如下类声明的一般格式如下:class 类名类名 public: 公有数据成员公有数据成员; 公有成员函数公有成员函数;protected: 保护数据成员保护数据成员; 保护成员函数保护成员函数;private: 私有数据成员私有数据成员; 私有成员函数私有成员函数; ;p类成员有三种访问属性类成员有三种访问属性:公有公有(public)、私有()、私有(private)和保护)和保护(protected)。)。p public的成员不但可以被类中成员的成员不但可以被类中成员函数访问函数访问;还可在类的外部还可在类的外部,通过类的通过类的对象进行

36、访问。对象进行访问。p private的成员只能被类中成员函数的成员只能被类中成员函数访问访问,不能在类的外部不能在类的外部,通过类的对象通过类的对象进行访问。进行访问。p protected的成员除了类本身的成员的成员除了类本身的成员函数可以访问外函数可以访问外,该类的派生类的成员该类的派生类的成员也可以访问也可以访问,但不能在类的外部但不能在类的外部,通过通过类的对象进行访问。类的对象进行访问。 二、面向对象的基本概念二、面向对象的基本概念-封装封装(encapsulation)31/例子例子 有关日期结构。有关日期结构。#include struct Date int year; int

37、 month; int day;main() Date date1; date1.year=2003; date1.month=8; date1.day=25; coutdate1.year.date1.month.date1.dayendl; return 0; /转为面向对象程序转为面向对象程序#include class CDate /日期类声明,封装了属性和方法日期类声明,封装了属性和方法 public: /公有属性公有属性 void setDate(int y,int m,int d); /方法声明方法声明 void showDate(); /方法声明方法声明 private: /私

38、有属性私有属性 int m_iYear; /属性属性 int m_iMonth; /属性属性 int m_iDay; /属性属性;void CDate:setDate(int y, int m, int d) /方法定义方法定义 m_iYear =y; /私有数据不能通过外部访问私有数据不能通过外部访问 m_iMonth =m; m_iDay =d;void CDate:showDate() /方法定义方法定义 coutm_iYear.m_iMonth.m_iDayendl; /代码从类外部也看不见代码从类外部也看不见main() CDate date1; /对象,对象,CDate类的一个实例

39、类的一个实例date1.setDate(2010,5,11); /接口,发送消息接口,发送消息date1.showDate(); /接口,发送消息接口,发送消息 return 0; 32二、面向对象的基本概念二、面向对象的基本概念-继承(继承(Inheritance)l广义地说,继承是指广义地说,继承是指能够直接获得已有的性质和特征,而不必重能够直接获得已有的性质和特征,而不必重复定义它们复定义它们。l在面向对象的软件技术中,在面向对象的软件技术中,继承是子类自动地共享基类中定义的继承是子类自动地共享基类中定义的数据和方法的机制。数据和方法的机制。33二、面向对象的基本概念二、面向对象的基本概

40、念-继承继承(Inheritance)l继承具有传递性继承具有传递性。如果类如果类C C继承类继承类B B,类,类B B继承类继承类A A,则类,则类C C继承类继承类A A。一个类实际上继承了它所在的类等级中在它上层的一个类实际上继承了它所在的类等级中在它上层的全部基类的所有描述。全部基类的所有描述。也就是说,属于某类的对象除了具有该类所描述的也就是说,属于某类的对象除了具有该类所描述的性质外,还具有类等级中该类上层全部基类描述的性质外,还具有类等级中该类上层全部基类描述的一切性质。一切性质。 l单继承单继承当一个类只允许有一个父类时,也就是说,当类等当一个类只允许有一个父类时,也就是说,当

41、类等级为树形结构时,类的继承是单继承;级为树形结构时,类的继承是单继承;l多重继承多重继承当允许一个类有多个父类时,类的继承是多重继承。当允许一个类有多个父类时,类的继承是多重继承。多重继承的类可以组合多个父类的性质构成所需要多重继承的类可以组合多个父类的性质构成所需要的性质。的性质。34/定义一个基类定义一个基类class person protected: char name10; int age; char sex; public: / ; /定义一个派生类定义一个派生类 class employee:public person protected: char department20;

42、 float salary; public: / ; 声明一个派生类的一般格式为声明一个派生类的一般格式为:class 派生类名派生类名:继承方式继承方式 基类名基类名 /派生类新增的数据成员和成员函数派生类新增的数据成员和成员函数 ; 由类由类person继承出类继承出类employee可以采用下面的三种可以采用下面的三种格式之一格式之一: (1) 公有继承公有继承 class employee:public person / ; (2) 私有继承私有继承 class employee:private person / /访问访问employee类时,类时, int age将成为将成为 pr

43、ivate的的 ; (3) 保护继承保护继承 class employee:protected person /访问访问employee类时,类时,int age将将 成为成为proteced的的 ; p二、面向对象的基本概念二、面向对象的基本概念-继承继承35在基类中的访问属性在基类中的访问属性继承方式继承方式在派生类中的访问属性在派生类中的访问属性privatepublic不可直接访问不可直接访问privateprivate 不可直接访问不可直接访问privateprotected 不可直接访问不可直接访问 publicpublic public public private privat

44、e public protected protected protected public protected protected private private protected protected protected基类成员在派生类中的访问属性基类成员在派生类中的访问属性-优先级优先级36/继承的简单例子继承的简单例子#include class CDate /日期类声明,封装了属性和方法日期类声明,封装了属性和方法 public: /公有属性公有属性 void setDate(int y,int m,int d); /方法声明方法声明 void showDate(); /方法声明方法声

45、明 private: /私有属性私有属性 int m_iYear; /属性属性 int m_iMonth; /属性属性 int m_iDay; /属性属性;void CDate:setDate(int y, int m, int d) /方法定义方法定义 m_iYear =y; /私有数据不能通过外部访问私有数据不能通过外部访问 m_iMonth =m; m_iDay =d;void CDate:showDate() /方法定义方法定义 coutm_iYear.m_iMonth.m_iDayendl; /代码从类外部也看不见代码从类外部也看不见class CMyTime :public CDa

46、te public: void setTime(int h,int mm,int s); void showTime(); private: int m_iHour; int m_iMinute; int m_iSecond;void CMyTime:setTime(int h, int mm, int s) m_iHour =h; m_iMinute =mm; m_iSecond =s;void CMyTime:showTime() coutm_iHour:m_iMinute:m_iSecondendl; main() CMyTime time1; time1.setDate(2010,5,

47、11); time1.showDate(); time1.setTime(12,12,12); time1.showTime(); return 0; 37二、面向对象的基本概念二、面向对象的基本概念-重载(重载(Overload)l在在C+语言中函数语言中函数重载是通过静态联编(也叫先前联重载是通过静态联编(也叫先前联编)实现的。编)实现的。l在编译时根据函数变元的个数和类型,决定在编译时根据函数变元的个数和类型,决定到底使用到底使用该函数的哪个实现代码该函数的哪个实现代码;l对于重载的运算符,同样是在编译时根据被操作数的对于重载的运算符,同样是在编译时根据被操作数的类型,决定使用该运算符的

48、哪种语义。类型,决定使用该运算符的哪种语义。38二、面向对象的基本概念二、面向对象的基本概念-重载(重载(Overload)l有两种重载:有两种重载:函数重载函数重载:l是指在同一作用域内的若干个参数特征不同的函数可以是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字;使用相同的函数名字;l注意:重载不关心函数的返回值是否相同,只要函数名注意:重载不关心函数的返回值是否相同,只要函数名相同,参数表不同,就算重载相同,参数表不同,就算重载l特别注意:重载是在同一作用域内,因此不同类中相同特别注意:重载是在同一作用域内,因此不同类中相同函数名的函数只能叫覆盖函数名的函数只能叫覆盖(

49、Override)或隐藏或隐藏(Hide);运算符重载:运算符重载:l是指同一个运算符可以施加于不同类型的操作数上面。是指同一个运算符可以施加于不同类型的操作数上面。39/重载的简单例子重载的简单例子#include class CA public:; class CB : public CA public: void f(int) cout CB:f(int) endl; void f(int,int) cout CB:f(int,int) endl; int f(int,int,int) cout CB:f(int,int,int) endl; return 1; void test()

50、f(1);f(1,1); f(1,1,1); ; int main() CB B; B.test(); return 0; p函数函数f(int,int)和和f(int,int,int)对函数对函数f(int)进行了重载进行了重载(Overload),p因为它们符合重载的条件:属于同因为它们符合重载的条件:属于同一作用域(都是类一作用域(都是类CB的成员函的成员函数);函数名相同,参数表不同;数);函数名相同,参数表不同;p重载的作用就是同一个函数有不同重载的作用就是同一个函数有不同的行为;的行为; 通过输入参数的不同就通过输入参数的不同就能执行不同操作能执行不同操作p执行结果是什么?执行结果

51、是什么?CB:f(int)CB:f(int,int)CB:f(int,int,int)40/隐藏的简单例子隐藏的简单例子#include class CA public: void f(int) cout CA:f(int) endl; ; class CB : public CA public: void f(int) cout CB:f(int) endl; void f(int,int) cout CB:f(int,int) endl; int f(int,int,int) cout CB:f(int,int,int) endl; return 1; void test() f(1);f

52、(1,1); f(1,1,1); ; int main() CB B; B.test(); return 0; p对上例稍作修改对上例稍作修改p执行结果是什么?执行结果是什么?p继承类继承类CB中的函数中的函数f(int)使得使得基类基类CA中的函数中的函数f(int)的功能的功能被隐藏被隐藏(Hide)了,或者说了,或者说CB中的中的f(int)对对CA中的中的f(int)进进行了覆盖(行了覆盖(Override)p我们要想我们要想f(1)的输出是:的输出是:CA:f(int),应该如何?,应该如何?能否将这一句注解掉?能否将这一句注解掉?CB:f(int)CB:f(int,int)CB:f

53、(int,int,int)41/隐藏的简单例子隐藏的简单例子#include class CA public: void f(int) cout CA:f(int) endl; ; class CB : public CA public: /void f(int) cout CB:f(int) endl; void f(int,int) cout CB:f(int,int) endl; int f(int,int,int) cout CB:f(int,int,int) endl; return 1; void test() f(1);f(1,1); f(1,1,1); ; int main()

54、 CB B; B.test(); return 0; p把继承类把继承类CB中的中的f(int)注解掉,注解掉,执行以后会出现什么结果?执行以后会出现什么结果?p说明什么问题:说明什么问题:CA:f(int)同同样被隐藏掉了!而且编译器找样被隐藏掉了!而且编译器找不到它!不到它!p原因:在调用一个类的成员函数时原因:在调用一个类的成员函数时,编译器会沿着类的继承链逐级的向上编译器会沿着类的继承链逐级的向上查找函数的定义查找函数的定义,如果找到了则停止如果找到了则停止查找查找p如果派生类如果派生类CB和基类和基类CA都有同一都有同一个同名函数个同名函数f(不论参数是否相同不论参数是否相同),编编

55、译器最终将选择派生类中的函数译器最终将选择派生类中的函数,即即派生类的成员函数派生类的成员函数“隐藏隐藏”了基类的了基类的成员函数成员函数, 它阻止了编译器继续向上它阻止了编译器继续向上查找函数的定义查找函数的定义 。error C2661: f : no overloaded function takes 1 parameters42二、面向对象的基本概念二、面向对象的基本概念-多态性(多态性(Polymorphism)l多态性是指在多态性是指在类等级的不同层次中可以共享(公用)类等级的不同层次中可以共享(公用)一个行为(方法)的名字一个行为(方法)的名字,然而不同层次中的每个类,然而不同层

56、次中的每个类却各自按自己的需要来实现这个行为。却各自按自己的需要来实现这个行为。l当对象接收到发送给它的消息时,根据该对象所属于当对象接收到发送给它的消息时,根据该对象所属于的类动态选用在该类中定义的实现算法。的类动态选用在该类中定义的实现算法。43二、面向对象的基本概念二、面向对象的基本概念-多态性多态性(Polymorphism)l在在 C+语言中,语言中,多态性是通过虚函数多态性是通过虚函数来实现的。来实现的。l在类等级不同层次中可以说明名字、参数特征和返回在类等级不同层次中可以说明名字、参数特征和返回值类型都相同的虚拟成员函数,而不同层次的类中的值类型都相同的虚拟成员函数,而不同层次的

57、类中的虚函数实现算法各不相同。虚函数实现算法各不相同。l虚函数机制使得程序员能在一个类等级中使用相同函虚函数机制使得程序员能在一个类等级中使用相同函数的多个不同版本,在运行时刻才根据接收消息的对数的多个不同版本,在运行时刻才根据接收消息的对象所属于的类象所属于的类,决定到底执行哪个特定的版本。,决定到底执行哪个特定的版本。44/多态的简单例子多态的简单例子#include class CA public: virtual void f(int) cout CA:f(int) endl; ; class CB : public CA public: void f(int) cout CB:f(i

58、nt) endl; ; class CC : public CA public: void f(int) cout CC:f(int) f(1); int main() CA A; CB B; CC C; test(&A); test(&B); test(&C); return 0; p虚函数同派生类的结合可使虚函数同派生类的结合可使C+支支持运行时的多态性,实现了在基类持运行时的多态性,实现了在基类定义派生类所拥有的通用接口,而定义派生类所拥有的通用接口,而在派生类定义具体的实现方法,即在派生类定义具体的实现方法,即常说的常说的“同一接口,多种方法同一接口,多种方法”

59、,它帮助程序员处理越来越复杂的程它帮助程序员处理越来越复杂的程序。序。p运行结果是什么?运行结果是什么?p虚函数的应用:使用基类的指针,虚函数的应用:使用基类的指针,指向派生类的对象,实现真正意指向派生类的对象,实现真正意义上的义上的Override。p实现正确实现正确Override的两个必要条件:的两个必要条件:(1)有)有virtual关键字关键字(2)基类)基类CA中的函数和派生类中的函数和派生类CB,CC中的函数要一模一样中的函数要一模一样(函数函数名,参数,返回类型名,参数,返回类型)都相同。都相同。考虑把考虑把virtual去掉结果会怎样?去掉结果会怎样? CA:f(int)CB

60、:f(int)CC:f(int)CA:f(int)CA:f(int)CA:f(int)45/多态的简单例子多态的简单例子#include class CA public: virtual void f(int) =0; ; class CB : public CA public: void f(int) cout CB:f(int) endl; ; class CC : public CA public: void f(int) cout CC:f(int) f(1); int main() /CA A; CB B; CC C; /test(&A); test(&B); test(&C); return 0; p

温馨提示

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

评论

0/150

提交评论