弥补程序员脑力的不足。一个在校生在学会C后,往往并没有机会用C去实践一个大中型的项目,体会不到在一个庞大软件工程中,非面向对象语言的短处,所以在之后学习C++的过程中,也就很难真正体会到面向对象语言的长处。简短一点说:不知道C的短处,就不懂C++的长处。相反,倒是很快就发现C++的缺点:它的代码效率多数情况下都要比C低不少。
前面我们说过低级语言与高级语言的对比,C++语言也正是从语法结构和语言功能上来限定或实现一门编程语言更加接近人在现实生活中的思维习惯,从而达到减轻人的记忆和判断上的负担。这其中最佳的方法之一就是所谓的“封装”。
VC的封装类库称为MFC,它是一种很低阶的封装,它并没有按照人类的思维习惯来重新组织和解释Windows对象(指Windows编程中所需的数据,处理,机制,接口), 而纯粹是API一对一的翻版。这样的封装工作带来代码封装所固有的代码效率降低的副作用,却没有给使用者带来任何方便。如果你是编程初学者,而你身边又有VC高手,那么你一定要多多向他学习请教,因为一个真正的VC编程高手,其同时一定也是一个深刻理解Windows内核机制(消息循环,内存管理,多任务实现,资源使用等),熟悉Windows各种常用API函数等等的高手。
C++Builder对封装库称为VCL(带VC字样,可别以为它是Visual C++,其实它是:Visual Component Library,即:可视控件库)。
VC的MFC和CB的VCL都是基于(但不限于)对Windows API(应用程序接口函数)的封装,为什么要对API进行封装?这就是回到了我们前面说过的,为什么有了C又会有C++的
问题。因为操作系统是用C和汇编写成的,它获得到操作系统必须的代码效率,但对应用程序开发者而言,它失去了易用性。所以微软和Borland都使用高级语言对之进行封装工作。二者谁进行得更好呢?
要想成为Windows编程高手,最终一定要绕过各种封装,理解Windows对象。但作为一个初学者,我们必须挑选一个好的封装。下面我们举字体(Font)作为例子,将三
2
者:没有封装过的Windows 字体API、封装过的MFC字体对象和封装过的VCL字体对象做一个对比。为了保证不会有偏倚和差错,有关前二者的代码,都是笔者从MSDN(微软提供的帮助
文档)中直接拷贝出来。
3
者几近雷同;既然你要封装,你就是要让它变得面向对象,易记易用;一模一样的照抄一遍,然后改改参数的名字,意义何在?如你是想维持代码的效率,那么在繁杂度一样的情况下,为什么我们不直接使用效率更高的API函数呢?
倘若说,MFC的“封装”纯粹是一种多余,那或许也还可以接受。然而MFC偏偏还要在这种冗余的封装上建立自已的应用
程序架构,和前面的“封装”一样,MFC建立应用架构的出发点也是良好的,为了方便Windows程序员编程的难度,而结果却更糟糕。有问题的架构犯了类库或接口提供者的大忌:“有协议编程”。
什么叫“有协议编程”?我们先来讲“无协议编程”。所谓“无协议编程”是指接口的提供者在提供接口时,同时也提供接口的使用约定,这一套约定应该在接口所要提
4
供的功能上广泛适用,而无须再有种种特殊的例外,这样的接口显然非常适于使用。学习编程,如果挑错了我们每天都要面对的封装类库,就将永远都在努力处理这些无任何意义的问题。
MFC的CWnd 提供了对Windows最基本的窗口元素的封装,其中对创建窗口的函数的封装为:
未封装的API: HWND CreateWindow(
LPCTSTR lpClassName, // registered class name LPCTSTR lpWindowName, // window name DWORD dwStyle, // window style
int x, // horizontal position of window int y, // vertical position of window int nWidth, // window width int nHeight, // window height
HWND hWndParent, //