从面向过程的程序设计到面向对象的程序设计,再到后面的com组件,经过了一个去曲折的过程。人们一直追求软件的生产能像轮船汽车一样,先按照标准制作部件,然后将部件组装,形成产品。于是,如何把一个大型的软件划分为重复可利用的标准模块是亟需解决的问题。作为可重用的模块,它应该具有相对独立、稳定,具有封装性,代码可重用的程序实体。软件模块化的发展历史如下所示:
1、函数模块及其接口
最初,人们是按照代码段的功能以函数的形式来划分软件的,把函数的声明放在头文件(*.h)中,把函数的定义放在实现文件(*.cpp)文件中,使用函数模块时包含头文件就可以了。
当开发一个大型软件时,程序总设计人员可以利用这种函数形式的模块,把一个大规模的程序分成若干个模块,规定了接口之后分给程序设计人员去实现,最后再把模块连接起来形成产品。但是随着软件规模的扩大,以函数为软件模块的程序设计方法的缺点也日益明显,其中数据与操作的分离是这种方法致命的弱点,当数据和操作函数的名字相同时,经常出现了张冠李戴的现象,很容易引起bug。
2、类模块及其接口
在长期的实践中,人们发现世界上由不同的事物组成,事物具有固有属性和行为,是相当独立和稳定的,世界上的所有问题是依靠事物之间的联系和交互来解决。所有计算机程序设计中以事物为着眼点,用类将程序中的数据和操作封装起来,达到对外部模块的独立性,并且加强了内部模块中数据成员和成员函数的联系。
类的标志性特性为:继承性、封装性和多态性。
(1) 继承性
类的继承是从现有类的基础上,派生出一个新的类,新派生的类自动具有了现有类的全部属性和特征,同时还可以加入原来的类没有的、新的属性和特征;如下图:
图1 交通工具层次图
飞机是客机、运输机、直升机的基类。客机、运输机、直升机具有飞机的特点,如在空中飞行,都具有飞行员和乘客成员;客机、运输机、直升机又具有更多的特点,如外形特征、运输量等。
派生类继承了基类所有的成员,其中派生类的访问权限由两个因素决定:
①成员在基类中的访问权限;
②继承方式。
如图2所示:
图2 派生类的继承方式