面向对象程序设计的基本特点
1.抽象
面向对象方法中的抽象,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。
抽象的过程,也是对问题进行分析和认识的过程,在面向对象的软件开发中,首先注意的是问题的本质及描述,
其次是解决问题的具体过程。一般来讲,对一个问题的抽象应该包括两个方面:数据抽象和行为抽象(或称为功
能抽象、代码抽象)。前者描述某类对象的属性或状态,也就是此类对象区别于彼类对象的特征;后者描述的是
某类对象的共同行为或功能特征。
例子:在计算机上实现一个简单的时钟程序。通过对时钟进行分析可以看出。需要三个整型数来存储时间,分别
表示时、分和秒,这就是对时钟所具有的数据进行抽象。另外,时钟要具有显示时间、设置时间等简单的功能,
这就是对它的行为的抽象。用C++的变量和函数可以将抽象后的时钟属性描述如下:
数据抽象:
int hour,int minute,int second;
功能抽象:
showTime(),setTime();
下一个例子是对人进行抽象。通过对人类进行归纳抽象,提取出其中的共性,可以得到如下的抽象描述:
共同的属性:如姓名、性别、年龄等,他们组成了人的数据抽象部分,用C++的语言的变量来表达,可以是:
string name,string sex,int age;
共同的行为:比如吃饭、行走这些生物性行为,以及工作、学习等社会性行为。这构成了人的行为抽象部分,也
可以用C++语言的函数表达:
eat(),walk(),work(),study()
2.封装
封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机的结合,形成”类“,其中的数据与函数就是类的成员。例如,在抽象的基础上,可以将时钟的数据和功能封装起来,构成一个时钟类。按照C++的语法,时钟类的定义如下:
class Clock //class关键字 类名
{ //边界
public: //外部接口
void setTime(int newH,int newM,int newS); //行为,代码成员
void showTime(); //行为,代码成员
private: //特定的访问权限
int hour,minute,second; //属性,数据成员
}; //边界
这里定义了一个名为Clock的类,其中的函数成员和数据成员,描述了抽象的结果。”{和”}“限定了类的边界,关键字public和private是用来指定成员的不同访问权限的。声明为public的两个函数为类提供了外部接口,外界只能通过这个接口来与Clock类发生联系。声明为private的三个整型数据是本类的私有数据,外部无法直接访问。
可以看到,通过封装使一部分成员充当类与外部成员的接口,而将其他成员隐藏起来,这样就达到了对成员访问权限的合理控制,使不同类之间的相互影响减小到最低限度,进而增强数据的安全性和简化程序编程工作。
将数据和代码封装成一个可重用的程序模块,在编写程序时就可以有效利用已有的成果。由于通过外部接口,依据特定的访问规则就可以使用封装好的模块,使用时可以不必了解类的实现细节。
3.继承
如何把特殊与一般的概念间的关系描述清楚,使得特殊概念之间既能共享一般的属性和行为,又能具有特殊的属性和行为?
继承,就是解决这个问题的。只有继承,才可以在一般概念基础上,派生出特殊概念,使得一般概念中的属性和行为可以被特殊概念共享,摆脱重复分析、重复开发的困境。
C++语言中提供了类的继承机制,允许程序员在原有雷特型的基础上,进行更具体、更详细的说明。
4.多态
从广义上说,多态性是指一段程序能够处理多种类型对象的能力。在C++语言中,这种多态性可以通过强制多态、重载多态、类型参数化多态、包含多态4种形式来实现。
强制多态是通过将一种类型的数据转换成另一种类型的数据来实现的,也就是数据类型转换(显式或隐式)。重载是指给同一个名字赋予不同的含义,如函数重载。这两种多态属于特殊多态性,只是表面的多态性。
包含多态和类型参数化多态属于一般多态性,是真正的多态性。C++中采用虚函数实现包含多态。虚函数是多态性的精华。模板是C++实现参数化多态性的工具,分为函数模板和类模板两种。