面向对象的基本概念
面向对象的方法有四个特点:抽象,封装,继承,多态。
抽象
所谓抽象,就是强调事物中与当前目标有关的本质特征,忽略非本质的次要特征,从而以共性特征作为划分依据并形成概念的过程。在面向对象的方法中,对一个问题的抽象包含两个方面:数据抽象和功能抽象。例如,就教务管理系统的开发而言,姓名,学号,班级,成绩等描述了学生的共同属性,这是数据抽象;而选课,学习等描述了学生的共性行为,这是功能抽象。用C++的变量和函数可以将上述抽象结果表示为:
数据抽象:char *name;char *studentNo;char* studentClass;int score;
功能抽象:selectCourse();study();
为了描述不同对象的相同特征,C++引入“类”的概念。类就是对具有相同属性和相同操作的一组相似对象的抽象。实例是某个特定的类所描述的一个具体对象,是类的具体化。
在类中包含两组定义:数据属性的定义和操作的定义。数据属性的定义就是说明数据属性值所属的类型,该类型限定了数据属性的取值范围和运算规则;操作的定义分为两部分:操作的规格说明(说明属于该类的对象能够进行那些操作以及操作的方式)和操作的过程说明(说明属于该类的对象如何进行这些操作)。
在类定义的基础上,可以具体说明该类的对象,例如,可以定义Student类,然后定义如"Tom",“LI”,"WANG"等属于Student类的对象。在确定对象的属性值时必须遵守该类的属性定义。同样,对象所能进行的操作以及操作的过程也只能遵守该类中的操作定义。
封装
所谓封装,就是把对象的属性和行为结合成一个独立的整体,并对外隐藏部分内部细节。
封装能带来两个好处:一是把对象的属性和行为结合为一个自治的独立单元,能够把构建系统的颗粒从函数层次提升到类层次;二是隐藏对象的内部细节,并向外界提供一组服务,使对象外部只能通过这些服务去改变对象的状态,而不能直接存取对象的内部属性,从而可以有效避免外部错误向内部传播,并降低程序调试的难度。例如:图(a)就体现了录音机的封装性————使用者只需要通过外部按键去操纵录音机的功能,无法直接改变录音机内部的状态,这样就避免的内部状态的紊乱。同时用户也不必担心内部的电子线路是如何实现各种功能的,只需了解它提供了哪些功能即可。
继承
某些类之间结构和行为特征的共性,如教师和学生。但是教师和学生又有自己的特殊的属性和操作。于是,我们可以定义类"People",该类中定义教师和学生在结构和行为方面的共性的内容,然后派生出"Teacher"类和"Student"子类,相应的"People"类也称为父类。作为子类的"Teacher"类和"Student"类,只需在父类的基础上,定义自己特殊的属性和操作即可。
广义地说,继承是指能够直接获得已有的性质和特征,而不必重复定义它们。在面向对象的软件技术中,继承是子类自动的共享父类中定义的数据和方法的机制。
当一个类只允许有一个直接父类时,该类的继承是单重继承;当一个类有多个直接父类时,类的继承时多重继承,如图(b)和图©所示。
多态
多态性是指同一消息被不同的对象接收时,可以产生多种不同的行为方式。
现实生活中这种多态现象比比皆是。例如,老师要求学生学习(即向学生发送一个study()消息),每个学生接受到这个消息之后,由于学习方法的差异,采取的行动也各不相同。具体到面向对象编程语言,多态性是指相同的函数名在不同的对象中有不同的实现方式。也就是说,多态性允许每个对象以个性化的方式去相应共同的消息。以继承性为基础的运行时多态,将继承性带来的共性化和多态性带来的个性化完美的结合起来,父类中定义共性的规范,子类以不同方式实现这一规范。这样,调用者只需按共性特征去管理众多子类对象,每个子类对象以各自的个性化去相应。这就大大提高了软件的可扩展性,当需要增加新的相应方式时,只需增加新的子类,不必修改父类以及调用者的使用方式。