按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
样的火锅拼盘是不能够就地吃的,你得给它加点能量。放把火烧它吧,这火就是所谓的
application object (在MFC 程序中就是衍生自CWinApp 的一个全域性对象)。是这
312
…………………………………………………………Page 375……………………………………………………………
第5章 總觀Application Framework
个对象引起了连锁反应(一连串的 'new'),使每一个形(类别)有了真正的体(对象),
把应用程序以及Application Framework 整个带动起来。一切因缘全由是起。
Application Framework 带来的革命精神是,程序模型已经存在,程序员只要依个人需求
加料就好:在衍生类别中改写虚拟函数,或在衍生类别中加上新的成员函数。这很像你
在火锅拼盘中依个人口味加盐添醋。
由于程序代码的初期规模十分一致(什么样风格的程序应该使用什么类别,是一成不变
的),而修改程序以符合私人需要的基本动作也很一致(我是指像「开辟一个空的骨干
函数」这种事情),你动不了Application Framework 的大架构,也不需要动。这是福利
不是约束。
应用程序代码骨干一致化的结果,使优越的软件开发工具如CASE (puter Aid
Software Engineering)tool 容易开发出来。你的程序代码大架构掌握在Application
Framework 设计者手上, 于是他们就有能力制作出整合开发环境( Integrated
Development Environment,IDE)了。这也是为什么Microsoft、Borland、Symantec、
Wat、IBM 等公司的整合开发环境进步得如此令人咋舌的原因了。
有人说工学院中唯一保有人文气息的只剩建筑系,我总觉得信息系也勉强可以算上。带
艺术气息的软件创作行为(我一直是这么认为的)将在Application Framework 出现后
逐渐成为工匠技术,而我们都将只是软件IC 装配厂里的男工女工。其实也没什么好顾
影自怜,功成名就的冠冕从来也不曾落在程序员头上;我们可能像纽约街头的普普
(
POP)工作者,自认为艺术家,可别人怎么看呢?不得而知!话说回来,把开发软件
这件事情从艺术降格到工技,对人类只有好处没有坏处。不是亨利福特,我们又如何能
够享受大众化的汽车?或许以后会出现「纯手工精制」的软件,谁感兴趣不得而知,我
自己嘛。。。唔。。。倒是从来不嫌机器馒头难吃。
如果要三言两语点出Application Framework 的特质,我会这么说:我们挖出别人早写
好的一整套模块(MFC 或OWL 或OpenClass)之中的一部份,给个引子(application
object)使它们一一具象化动起来,并被允许修改其中某些零件使这程序更符合私人需
313
…………………………………………………………Page 376……………………………………………………………
第篇 湷觥 FC 程式設計
求,如是而已。
我怎么说
侯捷的这一段话实在已经点出Application Framework 的精神。凝聚性强、组织化强的类
别库就是Application Framework 。一组合作无间的对象,彼此藉消息的流动而沟通,并
且互相调用对方的函数以求完成任务,这就是Application Framework 。对象存在哪里?
在MFC 中?! 这样的说法不是十分完善,因为MFC 的各个类别只是「对象属性(行
为)的定义」而已,我们不能够说MFC 中有实际的对象存在。唯有当程序被application
object (这是一个衍生自MFC CWinApp 的全域对象)引爆了,才将我们选用的类别一一
具象化起来,产生实体并开始动作。图5…1 是一个说明。
这样子说吧,静态情况下MFC 是一组类别库,但在程序执行时期它就生出了一群有活
动力的对象组。最重要的一点是,这些对象之间的关系早已建立好,不必我们(程序员)
操心。好比说当使用者按下菜单的【File/Open 】项,开文件对话框就会打开;使用者选好
档名后,Application Framework 就开始对着你的资料类别,唤起一个名为Serialize 的特
殊函数。这整个机制都埋好了,你只要把心力放在那个叫作Serialize 的函数上即可。
选用标准的类别,做出来的产品当然就没有什么特色,因为别人的零件和你的相同,兜
起来的成品也就一样。我指的是使用者接口(UI )对象。但你要知道,软件工业发展到
现阶段这个世代,着重的已不再是UI 的争奇斗艳,取巧哗众;UI 已经渐渐走上标准化
了。软件一决胜负的关键在资料的处理。事实上,在「真正做事」这一点,整个application
framework 是无能为力的,也就是说对于数据结构的安排,数据的处理,数据的显示,
Application Framework 所能提供的,无一不是单单一个空壳而已…在C++ 语言来讲就
是个虚拟函数。软件开发人员必须想办法改造(override )这些虚拟函数,才能符合个人
所需。基于C++ 语言的特性,我们很容易继承既有之类别并加上自己的特色,这就是物
件导向程序设计的主要精神。也因此,C++ 语言中有关于「继承」性质的份量,在MFC
程序设计里头占有很重的比例,在学习使用MFC 的同时,你应该对C++ 的继承性质和
虚拟函数有相当的认识。第2章有我个人对C++ 这两个性质的心得。
314
…………………………………………………………Page 377……………………………………………………………
第5章 總觀Application Framework
CMyWinApp theApp; // global object
。。。
这些对象之间的 BOOL CMyWinApp::InitInstance()
关联性非常强烈 {
CMultiDocTemplate* pDocTemplate;
,才有资格被称 pDocTemplate = new CMultiDocTemplate ( 应用程序挑选MFC 中的
为application IDR_MYTYPE;
RUNTIME_CLASS(CMyDoc); 类别,依序产生各对象。
framework。 RUNTIME_CLASS(CMyMDIChildWnd);
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
CMyMDIFrameWnd* pMyMainFrame = new CMyMDIFrameWnd;
。。。
}
CObject
CCmdTarget
MDIChildWnd
object CWinThread
CWinApp
CMyWinApp