面向对象程序设计(Object Oriented Programming——简称OOP)是软件系统设计与实现的方法,这种新方法既吸取了结构化程序设计的绝大部分优点,又考虑了现实世界与面向对象空间的映射
关系而提出的一种新思想,所追求的目标是将现实世界的问题求解尽可能的简单化。在自然世界和社会生活中,一个复杂的事物总是由很多部分组成的。例如,一个人是由姓名、性别、年龄、身高、体重等特征描述;一个自行车由轮子、车身、车把等部件组成;一台电脑由主机、显示器、键盘、鼠标等部件组成。当人们生产一台电脑的时候,并不是先要生产主机再生产显示器再生产键盘鼠标,即不是顺序执行的。而是分别生产设计主机、显示器、键盘、鼠标等,最后把他们组装起来。这些部件通过事先设计好的接口连接,以便协调的工作。比如通过键盘输入可以在显示器上显示字或图形。这就是面向对象程序设计的基本思路。
面向对象的程序设计使程序设计更加贴近实现世界,用于开发较大规模的程序,以提高程序开发的效率。面向对象程序设计方法提出了一些全新的概念,比如类和对象,下面分别讨论这几个概念。
1.对象
对象又称实例,是客观世界中一个实际存在的事物。它既具有静态的属性(或称状态),又具有动态的行为(或称操作)。所以,现实世界中的对象一般可以表示为:属性+行为。例如一个盒子就是一个对象,它具有的属性为该盒子的长、宽和高等;具有的操作为求盒子的容量等。再如,张三是现实世界中一个具体的人,他具有身高、体重(静态特征),能够思考和做运动(动态特征)。
2.类
在面向对象程序设计中,类是具有相同属性数据和操作的对象的集合,它是对一类对象的抽象描述。例如,我们把载人数量5~7人的、各种品牌的、使用汽油或者柴油的、四个轮子的汽车统称为小轿车,也就是说,从众多的具体车辆中抽象出小轿车类。再例如,我们把一所高校所有在校的、男性或女性的、各个班级的、各个专业的本科生、研究生统称为学生,可以从众多的具体学生中抽象出学生类。
对事物进行分类时,依据的原则是抽象,将注意力集中在与目标有关的本质特征上,而忽略事物的非本质特征,进而找出这些事物的所有共同点,把具有共同性质的事物划分为一类,得到一个抽象的概念。日常生活中的汽车、房子、人、衣服等概念都是人们在长期的生产和生活实践中抽象出来的概念。
面向对象方法中的“类”,是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了抽象的描述,其内部包括属性和行为两个主要部分。
类是创建对象的模板,它包含着所创建对象的属性描述和方法定义。一般是先定义类,再由类创建其对象,按照类模板创建一个个具体的对象(实例)。
3.消息
面向对象技术的封装使得对象相互独立,各个对象要相互协作实现系统的功能则需要对象之间的消息传递机制。消息是一个对象向另一个对象发出的服务请求,进行对象之间的通信。也可以说是一个对象调用另一个对象的方法(Method)或称为函数(Function)。
通常,把发送消息的对象称为发送者,接收消息的对象称为接收者。在对象传递消息中只包含发送者的要求,他指示接受者要完成那些处理,但并不告诉接受者这应该如何完成这些处理,接收者接收到消息后要独立决定采用什么方式完成所需的处理。同一对象可接收不同形式的多个消息,产生不同的响应;相同形式的消息可送给不同的对象,不同的对象对于形式相同的消息可以有不同的解释,做出不同的响应。
在面向对象设计设计中,对象是节点,消息是纽带。应注意不要过度侧重如何构建对象及对象间的各种关系,而忽略对消息(对象间的通信机制)的设计。
4.面向对象程序设计(ObjectOriented Programming——OOP)
面向对象程序设计是将数据(属性)及对数据的操作算法(行为)封装在一起,作为一个相互依存、不可分割的整体来处理。面向对象程序设计的结构如下所示:
对象=数据(属性)+算法(行为)
程序=对象+对象+……+对象
面向对象程序设计的优点表现在:可以解决软件工程的两个主要问题——软件复杂性控制和软件生产效率的提高,另外它还符合人类的思维方式,能自然地表现出现实世界的实体和问题。
5.面向对象程序设计的特点
面向对象程序设计具有封装、继承、多态三大特性。
1. 封装性
封装是一种数据隐藏技术,在面向对象程序设计中可以把数据和与数据有关的操作集中在一起形成类,将类的一部分属性和操作隐藏起来,不让用户访问,另一部分作为类的外部接口,用户可以访问。类通过接口与外部发生联系、沟通信息,用户只能通过类的外部接口使用类提供的服务,发送和接收消息,而内部的具体实现细节则被隐藏起来,对外是不可见的,增强了系统的可维护性。
2. 继承性
在面向对象程序设计中,继承是指新建的类从已有的类那里获得已有的属性和操作。已有的类称为基类或父类,继承基类而产生的新建类称为基类的子类或派生类。由父类产生子类的过程称为类的派生。继承有效地实现了软件代码的重用,增强了系统的可扩充性。同时也提高软件开发效率。下面已交通工具的层次结构来说明(如图所示)。
交通工具的层次结构
交通工具类是一个基类(也称做父类),交通工具类包括速度、额定载人数量和驾驶等交通工具所共同具备的基本特征。给交通工具细分类的时候,有汽车类、火车类和飞机类等等,汽车类、火车类和飞机类同样具备速度和额定载人数量这样的特性,而这些特性是所有交通工具所共有的,那么当建立汽车类、火车类和飞机类的时候我们无需再定义基类已经有的数据成员,而只需要描述汽车类、火车类和飞机类所特有的特性即可。例如汽车还有自己的特性,比如刹车、离合、油门、发动机等。飞机类、火车类和汽车类是在交通工具类原有基础上增加自己的特性而来的,就是交通工具类的派生类(也称作子类)。以此类推,层层递增,这种子类获得父类特性的概念就是继承。继承是实现软件重用的一种方法。
3. 多态性
在面向对象程序设计中,多态性是面向对象的另一重要特征。
面向对象的通信机制是消息,面向对象技术是通过向未知对象发送消息来进行程序设计的,当一个对象发出消息时,对于相同的消息,不同的对象具有不同的反应能力。这样,一个消息可以产生不同的响应效果,这种现象称为多态性。
在操作计算机时,“双击鼠标左键”这个操作可以很形象地说明多态性的概念。如果发送消息“双击鼠标左键”,不同的对象会有不同的反应。比如,“文件夹”对象收到双击消息后,其产生的操作是打开这个文件夹;而“可执行文件”对象收到双击消息后,其产生的操作是执行这个文件;如果是音乐文件,会播放这个音乐;如果是图形文件,会使用相关工具软件打开这个图形。很显然,打开文件夹、播放音乐、打开图形文件需要不同的函数体。但是在这里,它们可以被同一条消息“双击鼠标左键”来引发,这就是多态性。
多态性是面向对象程序设计的一个重要特征。它减轻了程序员的记忆负担,使程序的设计和修改更加灵活,多态性其好处是,用户不必知道某个对象所属的类就可以执行多态行为,从而为程序设计带来更大方便。利用多态性可以设计和实现一个易于扩展的系统。
6.可视化程序设计
可视化程序设计利用可视化程序设计语言本身所提供的各种工具构造应用程序的各种界面,使得整个界面设计是在“所见即所得”的可视化状态下完成。相对于编写代码方式的程序设计而言,可视化程序设计具有直观形象、方便高效等优点。
可视化程序设计也是基于面向对象的思想,但不需通过编写程序代码的方式来定义类或对象,而是直接利用工具箱中提供的大量界面元素(例如在Visual Basic中称为控件),在设计应用程序界面时,只需利用鼠标把这些控件对象拖动到窗体的适当位置,再设置它们的属性,就可以设计出所需的应用程序界面。界面设计不需要编写大量代码,底层的一些程序代码由可视化程序设计语言自动生成。