面向对象基础.docx
- 文档编号:2207869
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:14
- 大小:108.19KB
面向对象基础.docx
《面向对象基础.docx》由会员分享,可在线阅读,更多相关《面向对象基础.docx(14页珍藏版)》请在冰豆网上搜索。
面向对象基础
面向对象基础
本章将介绍面向对象程序设计的基本概念。
对许多人来说,如果不了解面向对象的背景知识而直接进入面向对象程序设计,可能会有些困难。
这里预先介绍面向对象技术的一些基础知识,作为一个简要的参考。
有些读者可能要看到具体的语言和程序结构之后才能了解其整体概念,那么可以跳过本章,不会妨碍后续章节C++语言的学习。
但是最终回过头来补充本章内容,对于理解对象的重要性和面向对象程序设计的必要性也有助益。
1.1程序设计范型
程序主要由算法和数据两个方面组成。
在计算机的发展史上,程序的这两个主要方面一直保持不变,但它们之间的关系却在不断地发展演化,形成了所谓的程序设计方法,也被称作程序设计范型(paradigm)。
典型的程序设计范型包括:
过程式程序设计、基于对象的程序设计、面向对象的程序设计和泛型程序设计。
过程式程序设计是最传统、使用最久的方法。
在过程式程序设计方法中,问题分解是控制复杂性的主要手段,一个问题可以由一组算法来建模。
对一个要解决的问题进行自上而下的逐级分解,得到一组子问题;再利用子过程来分别解决这些子问题,最终通过主程序中对子过程的调用实现整个问题的解。
程序处理的数据被独立存储起来,各个子过程可以在全局位置访问这些数据,或者将数据传递给过程以便其访问。
著名的过程式程序设计语言有Fortran、C、Pascal等。
20世纪70年代,程序设计的焦点从过程式程序设计转移到了抽象数据类型(AbstractDataType,ADT)的设计上,现在称之为基于对象的程序设计。
在基于对象的程序设计方法中,通过一组数据抽象来对问题建模,这些抽象被称为类。
与类相关的算法被称为该类的公有接口,数据以私有的形式被存储在各个对象中,对数据的访问与一般的程序代码隔离开来。
系统则由类的对象实例之间的相互作用表现出来。
Ada是支持抽象数据类型的代表语言之一。
面向对象的程序设计(Object-OrientedProgramming,OOP)方法通过继承机制和动态绑定机制扩展了抽象数据类型。
继承机制是对已有类代码的复用,动态绑定是对已有的公有接口的复用。
以前独立的类型通过继承建立了类型/子类型的特定关系,共享的公有接口和私有的数据都放在一个抽象类中,每个特殊的类都从抽象类继承共享的行为,它们只需要提供与自身行为相关的算法和数据。
支持面向对象程序设计方法的语言有Smalltalk、C++和Java等。
有时需要设计能够处理各种数据类型的通用数据结构和通用算法,如通用链表、通用排序算法,这称为通用型程序设计,也叫做泛型程序设计。
这种方法的主要思想是通过数据类型的参数化,使算法对各种适当的类型和数据结构工作。
一些程序语言的设计者认为,某种程序设计方法本身并不足以轻易解决所有程序设计问题,提倡结合各种方法,形成支持多范型的程序设计语言,如C++就是支持上述多种程序设计方法的混合型语言。
近年来新兴起对面向方面程序设计(AspectOrientedProgramming,AOP)及其相关开发技术的研究。
传统开发方法主要根据功能对系统进行划分,而软件的非功能需求,如安全性,往往横贯在这些功能模块中,而不是独立存在的。
从程序设计的角度看来,程序中就会出现大量横切在各个功能模块中的实现非功能需求的代码。
AOP是针对多个横切的关注(concern)或方面(aspect)的程序设计活动,程序员用独立的模块表达各个关注的行为,最终使用一种称为编织(weaving)的技术将其融入程序代码。
面向方面方法代表了一种不同于以往的开发思想,在实际应用中大量使用之前,还需要对很多相关技术进行研究和完善。
目前具有代表性的面向方面程序设计语言是AspectJ。
1.2程序设计与抽象的过程
编写程序的目的是解决特定问题,而解决问题的过程离不开抽象,人们能够解决的问题的复杂性与抽象的类型和质量直接相关。
抽象是从被研究对象中抽取出共同的、本质的、与研究问题相关的特征,而舍弃其个别的、非本质的、与研究问题无关的次要特征。
抽象的过程即是一个裁剪的过程,个别的、非本质的特征被裁剪掉了。
例如,青蛙、公鸡、蛇、大象、狮子虽然不同,但可以根据它们的共同特征将它们抽象为一个共同的概念——动物。
所有的程序设计语言都提供抽象:
汇编语言是对底层机器指令的抽象;命令式语言,如Fortran和C等早期高级语言,是对汇编语言的抽象。
这些语言都要求程序员按计算机的结构去思考,而不是按要解决的问题的结构去思考。
也就是说,程序员必须在“问题空间”(即要解决的问题存在的空间)和“解空间”(问题的解决模型所在的空间,如计算机)之间建立联系。
例如,人们使用银行存款业务时的“存折”,这个问题空间中的概念如何与其在解空间中的表示对应起来呢?
在“银行业务管理软件系统”中“存折”应如何表示?
显然,这种对机器建模的抽象方式在表达实际概念时有很多困难。
还有一种抽象方法是面向要解决的问题建模,如LISP语言把所有问题最终都看做是表,APL语言将所有问题都看做是算法,PROLOG语言将所有问题都看做是决策链。
这些方法对于其针对的特定问题而言是很好的解决方案,但是对于该领域之外的问题就显得极其不自然了。
面向对象方法为程序员提供了表示问题空间中各种事物元素的工具,并且这种表示法是通用的。
问题空间中的事物和它们在解空间中的表示被称为“对象”。
可以向程序中添加新的对象类型,根据问题空间中的术语对程序进行调整。
这样,阅读描述问题解决方案的代码就是在阅读表达该问题的文字。
较之以前,这是一种更灵活、更强大的语言抽象。
因此,OOP允许程序员用问题空间中的术语来描述问题,而不是用运行解决方案的计算机的术语来描述。
每个对象就像是一个小的自治单元,有状态,有可执行的运算,就像是现实世界中的对象一样,有特性和行为。
面向对象程序设计的过程就是抽象的过程,将问题空间中的事物抽象为解空间中的面向对象概念,并在程序中用面向对象的风格表达和组织这些概念。
1.3面向对象的基本概念
对象已经成为现代软件无所不在的构造块,而面向对象是当代软件工程实践的普遍范型。
仅就字面而言,“面向对象(objectoriented)”这个术语的意思是很不确定的。
在英文词典中,“object”的解释是“Athingpresentedtoorcapableofbeingpresentedtothesenses.(感知到的或者能够被感知到的东西)”。
也就是说,对象几乎是任何事物。
“Oriented”被定义为“directedtoward(面向)”,其作用是将术语“objectoriented”变成一个形容词。
因此,“objectoriented”的字面意思是“Directedtowardjustaboutanythingyoucanthinkof.(面向任何你能够想到的事物)”。
那么在软件领域,“面向对象”到底是什么意思呢?
迄今为止,没有人给出其精确定义,但是它总是和一系列概念相联系,并由这些概念刻画,其中出现频率最高的是:
封装、对象、类、信息/实现隐藏、消息传递、继承、多态性。
1.3.1封装
封装是将一组相关的概念聚集在一个单元内,并且用单独的一个名字来引用。
封装的概念几乎自软件本身出现以来就已存在。
早在20世纪40年代,程序员就注意到在一个程序中相同的指令序列可能出现多次,并很快意识到可以将重复的指令序列放在某个地方并用一个名字来调用它。
这就是子过程,它封装了一组指令。
子过程不仅避免了相同指令序列的重复出现,节省了内存空间,而且容易使用,因为它用一个概念表达了一组指令。
面向对象的封装和子过程有相似的目的,但是结构更加复杂。
面向对象的封装是将操作和表示状态的属性包装在一个对象类型中,从而使状态只能通过封装体提供的接口来访问和修改。
例如,图1.1表示圆形(Circle)对象的属性和操作。
圆形对象的状态由两个属性描述:
圆心center和半径radius。
这些属性隐藏了起来,不对外公开。
从外部不能通过直接修改center或radius来改变一个圆的状态。
圆形还提供了一些操作:
获取圆心的getCenter、获取半径的getRadius、计算面积的area、移动操作move和缩放操作scale。
这些操作对外公开,构成圆形的接口。
通过调用接口中的这些操作,从外部就可以查询圆的状态或对圆进行移动和缩放操作。
例如,使用getRadius操作可以获取圆的半径,调用move操作可以改变圆心,引起center属性值的变化,即改变圆的状态。
图1.1封装:
圆形对象的操作和属性
对象是一组属性和操作的封装体。
操作是其他对象可见的函数或过程,可以被其他对象调用。
属性表示对象存储的信息,只能通过对象自己的操作来访问和更新,其他对象不能直接访问和修改。
如果想获得属性持有的信息,只能求助于该对象的某个操作。
因为对象的属性只能由自己的操作读取和更新,这些操作就形成了一个保护圈,将对象的核心实现包围起来,如图1.1所示。
1.3.2对象和类
所有对象都是一类对象中的一员,它们有共同的特征和行为。
例如,所有的圆都是“圆形”类型的,都有圆心和半径,都可以执行计算面积的操作;所有的学生都是“学生”类型的,都有学号、姓名和出生日期,都可以选修课程和参加考试。
为了描述一组对象在结构和行为上的共性,可以创建抽象数据类型,称为类(class)。
例如:
圆形类Circle,学生类Student。
类中有属性和操作:
属性描述对象的数据特征,操作描述对象的行为特征。
例如,Circle类中有描述圆心和半径的属性center和radius,有计算面积的操作area();Student类中有描述姓名和出生日期的属性name和birthday,有选课操作take()。
类的有些属性和操作是对外部使用者公开的,构成类的接口。
例如,Circle类的接口中包括area()、getRadius()等操作;Student类的接口中包括name属性和take()操作,但是birthday属性不应该对外公开,不在类接口中。
一个类的所有实例都具有某些共性,如每个学生都有姓名。
同时每个实例都有自己的状态,如一个学生的姓名为“张宇”,另一个学生的姓名为“王立”。
这样,在程序中,每个学生都可以被描述为唯一的实体,这个实体就是对象。
每个对象都属于一个特定的类,这个类定义了它的特性和行为。
由于类描述了一组有相同属性和相同操作的对象,因此类实际上就是数据类型,只不过和一般的数据类型(如浮点型)相比,定义类是为了与具体问题相适应,而不是被迫使用已有的数据类型。
创建类是面向对象程序设计的基本工作。
类类型几乎能完全像内部类型一样工作,程序员可以创建类类型的变量,也可以操纵这些变量。
类类型的变量称为对象或类的实例。
类是创建对象的模板,从一个类实例化的每个对象具有相同的结构和行为。
一旦定义了一个类,程序员就可以创建这个类的任意数目的对象,然后操作这些对象。
对象是面向对象程序的基本元素。
例如,在图1.2的程序中创建了一个Circle类的对象cobj。
图1.2圆形类Circle
类和对象的UML表示法如图1.3所示。
类用一个分为三栏的矩形框表示,包括类名、属性和操作。
其中类名是必须给出的,属性和操作是可选的,如图中Circle类的两种表示。
属性和操作名字前面的“+”或“-”表示它们的可见性。
“+”表示操作或属性是对外公开的,而“-”表示它们是隐藏起来的,不能被外部使用。
对象也用矩形框表示,其中给出对象的名字、类型和属性值,如图中的cobj对象。
图1.3类和对象的UML图示
1.3.3接口、实现和消息传递
可以向对象发出请求让它执行某个操作,这称为向对象发送消息。
每个对象只能接收特定的消息,对象可以接收的消息由它所属类的接口确定。
类的接口由对外公开的操作和属性构成。
例如,图1.2所示的Circle类定义的接口中包括一组操作:
area()、perimeter()、mo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 基础
![提示](https://static.bdocx.com/images/bang_tan.gif)