OOP_面向对象程序设计概述
李际军老师“面向对象程序设计”课程第一课笔记整理
面向对象程序设计概述
20世纪90年代以来面向对象程序设计(Object Oriented Programming, 简称OOP) 迅速地在全世界流行, 并一跃成为程序设计的主流技术。
现在,面向对象程序设计的思想已经被越来越多的软件设计人员所接受,不仅因为它是一种最先进的新颖的计算机程序设计思想,更主要的是这种新的思想更接近人的思维活动, 人们利用这种思想进行程序设计时,可以很大程度地提高编程能力, 减少软件维护的开销。
面向对象程序设计方法是通过增加软件的可扩充性和可重用性来提高程序员的编程能力的。这种思想与我们以前使用的方法有很大的不同,并且在理解上有一些难点。
什么是面向对象程序设计
新的程序设计范型
程序设计范型是指设计程序的规范、 模型和风格, 它是一类程序设计语言的基础。
- 面向过程程序设计范型:
- 程序=过程+调用
- 程序=算法+数据结构
如C、 Pascal、 Ada
- 函数式程序设计范型:程序被看作“描述输入与输出之间关系” 的数学函数。
如LISP
- 面向对象程序设计是一种新型的程序设计范型。 这种范型的主要特征是:
- 对象=(算法+数据结构)
- 程序=对象+消息
面向对象程序的主要结构特点:
- 第一,程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规律。
- 第二,程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法完成相应的操作。
面向对象程序设计的基本概念
- 对象
- 类
- 消息
- 方法
1. 对象
在现实世界中,任何事物都是对象。可以是有形的具体存在的事物, 也可以是无形的抽象的事件。
现实世界中的对象,具有以下特性:
- 名字: 用于区别不同的实体
- 属性/状态: 属性用于描述不同实体的特征;状态由这个对象的属性和这些属性的当前值决定
- 操作: 用于描述不同实体可具有的行为,是对象提供给她用户的一种服务,也叫行为或方法
- 一类是自身所承受的操作
- 一类是施加于其他对象的操作。
在面向对象程序设计中,对象是描述其属性的属性及对这些数据施加的一组操作封装在一起构成的统一体。
对象一般可以表示为: 属性+操作(方法)
- 方法(Method)——就是对象所能执行的操作,即服务。方法描述了对象执行操作的算法,响应消息的方法。在C++中称为成员函数。
- 属性(Attribute)——就是类中所定义的数据,它是对客观世界实体所具有性质的抽象。C++中称为数据成员。
思考:
- 下列关于对象的描述不正确的是( )
- A 对象只能描述有形的东西
- B 对象具有属性和服务两个主要因素
- C 现实世界中的一切事物都可以看作对象,但只有在具体的统中加以论述才有实际的意义
- D 对象的属性是对象的静态特征,服务是动态特征,并且对象的属性只能由本对象的服务来操作
A
- 构成对象的两个主要因素是( 属性 )和(服务),其中(服务)属于动态属性,(属性)属于静态属性,(属性)只能由(服务)来操作。
2. 类
在实现世界中,“类”是一组具有相同属性和行为的对象的抽象。
类和对象之间的关系是抽象和具体的关系。 类是多个对象进行综合抽象的结果,一个对象是类的一个实例。
在面向对象程序设计中, 类就是具有相同数据和相同操作的一组对象的集合。 是对具有相同数据结构和相同操作的一类对象的描述。
在面向对象程序设计中, 总是先声明类, 再由类生成其对象。
确定一个事物是一个类的步骤:
- 判断它是否有一个以上的实例,若有则可能是一个类
- 判断类的实例中有否绝对的不同点,若无则是一个类
- 如:颜色与鲜花联系在一起只是鲜花的一种状态,因为表示颜色的是一些值:红、黄、紫、白等, 不是一个类;
- 而颜色同包括复杂颜色计算机的图形处理系统联系在一起,这时的颜色是基于颜色三元素(红、绿、蓝)的成分比例和色度的变量,可以附带很多行为,所以是一个类。
可以看出,一次能正确划分类是不可能的,所以需要不断的对实际问题进行分析和整理。
注意:不能把一组函数组合在一起构成类!即类不是函数的集合。
如例,定义类Mathhelper
:
class Mathhelper{
public:
double sqrt(double aNumber);
double power(double aNumber,int raiseto);
double inverse(double aNumber);
private:
};
分析有何不妥!没有需要管理的私有数据!
思考:
1.关于类和对象的说法不正确的是()
- A 类是对象的类,对象是类的对象
- B 系统不为类分配内存空间,而为对象分配内存空间
- C 如果把人看作动物,那么细菌也是动物
- D 类可以看作数据类型,对象也可以叫做对象的实体、实例等
2.类是()的集合,分类的依据是()
具有相同属性和服务的一组对象 抽象
3. 消息
面向对象设计技术必须提供一种机制允许一个对象与另一个对象的交互,这种机制叫消息传递。
在面向对象程序设计中,一个对象向另一个对象发出的请求被称为“消息”。当对象收到消息时,就调用有关的方法,执行相应的操作。消息是一个对象要求另一个对象执行某个操作的的规格说明,通过消息传递才能完成对象之间的相互请求或相互协作。
消息具有三个性质:
- 同一个对象可以接收不同形式的多个消息,作出不同的响应。
- 相同形式的消息可以传递给不同的对象,所作出的响应可以是不同的。
- 对消息的响应并不是必需的, 对象可以响应消息, 也可以不响应
消息分两类
- 公有消息(其它对象发出)
- 私有消息(向自己发出)
一个消息由三部分组成:
- 接收消息的对象;
- 消息名;
- 零个或多个变元。
4. 方法
方法就是对象所能执行的操作。方法包括界面和方法体两部分。
- 方法的界面就是消息的模式,它给出了方法调用的协议;
- 方法体则是实现某种操作的一系列计算步骤,就是一段程序。
在C++语言中方法是通过函数来实现的,称为成员函数
消息和方法的关系
对象根据接收到的消息,调用相应的方法;反过来, 有了方法,对象才能响应相应的消息。
面向对象程序设计的基本特征
- 抽 象
- 封 装
- 继 承
- 多 态
1. 抽象
抽象是人类认识问题的最基本的手段之一。
抽象是通过特定的实例(对象)抽取共同性质以后形成概念的过程。抽象是对系统的简化描述和规范说明,他强调了系统中的一部分细节和特性,而忽略了其他部分。
抽象包括两个方面:数据抽象和代码抽象(或称行为抽象)。前者描述某类对象的属性和状况,也就是此类对象区别于彼类对象的特征物理量;后者描述了某类对象的共同行为特征或具有的共同操作。
在面向对象的程序设计方法中,对一个具体问题的抽象分析结果,是通过类来描述和实现的。
2. 封装 encapsulation
在现实世界中,封装就是把某个事物包围起来,使外界不知道该事物的具体内容。
在面向对象程序设计中,封装是指把数据和实现操作的代码集中起来放在对象内部,并尽可能隐蔽对象的内部细节。
封装应该具有如下几个条件:
- 对象具有一个清晰的边界,操作的代码被封装在该边界内
- 具有一个描述对象与其他对象如何相互作用的接口,该接口必须说明消息如何传递的使用方法
- 对象内部的代码和数据应受到保护,其他对象不能直接修改。
思考:
- 对象的封装就是()
- A 与世隔绝
- B 只进不出
- C 可进可出,但是外界不能干涉内部的处理过程
- D 封装只是抽象的封装,外界可以直接干预
C
- 关于类的继承不正确的是()
- A 引入类的继承目的就是为了代码重用,提高编程效率
- B 子女有父母的特征是类的继承
- C 子继父产业是类的继承
- D 子类可以全部继承父类的属性和服务,也可部分继承父类的属性和服务
C
3. 继承 inheritance
继承是在一个已经建立的类的基础上再接着声明一个新类的扩展机制,原先已经建立的类称为基类,在基类之下扩展的类称为派生类,派生类又可以向下充当继续扩展的基类,因此构成层层派生的一个动态扩展过程。
派生类享有基类的数据结构和算法,而本身又具有增加的行为和特性,因此继承的机制促进了程序代码的可重用性。
一个基类可以有多个派生类,一个派生类反过来可以具有多个基类,形成复杂的继承树层次体系。
基类与派生类之间有一个本质的关系
基类是一个简单的类,描述相对简单的事物,派生类是一个复杂些的类,处理相对复杂的现象。
这样一种简单到复杂的关系正是人们认识自然过程的线性映射,软件的可扩充性建立在这样一种对自然的正确回归上便拥有了坚实的基础。
继承的作用:
- 避免公用代码的重复开发,减少代码和数据冗余。
- 通过增强一致性来减少模块间的接口。
- 继承分为单继承和多继承。
4. 多态 polymorphism
多态性是指不同的对象收到相同的消息时产生多种不同的行为方式。
C++支持两种多态性:编译时的多态性(重载)和运行时的多态性(虚函数)。
为什么要使用面向对象程序设计
传统程序设计方法的局限性
- 传统程序设计开发软件的生产效率低下,存在重用性、复杂性和可维护性问题
- 重用性:传统程序设计从语句一级开始编程,缺乏大粒度、可重用性的构件。
- 复杂性:传统程序设计数据与操作分离,如果一个或多个数据的结构发生变化,将波及程序的很多部分甚至整个程序。
- 可维护性:传统程序设计数据与操作相分离的结构使得维护数据和处理数据的操作过程要花费大量的时间和精力。
- 传统程序设计难以应付日益庞大的信息量和多样的信息
类型- 当代计算机所处理的数据已从最简单的数据和字符发展为具有多种格式的多媒体数据,如文本、图形、图像、影像、声音等。面对庞大的信息量和多样的信息格式,传统程序设计无法应付。
- 传统的程序设计难以适应各种新环境
- 当前,并行处理、分布式、网络和多机系统等节点之间的通信机制传统的程序设计技术很难处理。
面向对象程序设计的主要优点
- 可提高程序的重用性
- “类”作为大粒度的构件提高了程序的重用性。
- 两种重复使用类的方法:
- 建立在各种环境下都能使用的类库或对象集。
- 从基类派生出子类
- 可控制程序的复杂性
- 通过”类“联系数据及对数据的操作,有效控制了程序的复杂性
- 可改善程序的可维护性
- 消息传递机制使得对方法体中的任何修改不会导致发送消息的程序修改
- 类的封装和信息隐藏机制使得外界对其中的数据和程序代码的非法操作成为不可能。
- 能够更好地支持大型程序设计
- 类作为一个程序模块,比通常的子程序的独立性强的多。
- 动态连接和继承机制进一步发展了基于数据抽象的模块化设计。
- 增强了计算机处理信息的范围
- 用类来直接描述现实世界中的类型,可使计算机系统的描述和处理对象从数据扩展到现实世界和思维世界的各种事物,大大扩展了计算机系统处理的信息量和信息类型。
- 能很好地适应新的硬件环境
- 面向对象程序设计中的对象、消息传递等思想和机制,与分布式、并行处理、多机系统及网络等硬件环境恰好吻合。