按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
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
Application Document
View object CWnd
object object
CView
CMyView
MDIFrameWnd CFrameWnd
object
CMDIFrameWnd CMyMDIFrameWnd
Application object 是全域对象,其它对象以'new' 动态产生。 CMDIChildWnd CMyMDIChildWnd
MFC 是一个零组件超级市场,所贩卖之零组件的 CDocument
功能以及零组件彼此之间的关系都已定义好;我 CMyDoc
们选择适当的零组件,兜出一个应用程序。 CDocTemplate
CMultiDocTemplate
图5…1 MFC 是一个零组件超级市场,所贩卖的零组件功能以及零组件彼此之
间的关系都已定义好;我们选择自己喜欢的零件,兜出一个应用程序。
Application Framework 究竟能提供我们多么实用的类别呢?或者我们这么问:哪些工作
已经被处理掉了,哪些工作必须由程序员扛下来?比方说一个标准的MFC 程序应该有
一个可以读写文件资料的功能,然而应用程序本身有它独特的数据结构,从MFC 得来的
零件可能与我的个人需求搭配吗?
我以另一个比喻做回答。
315
…………………………………………………………Page 378……………………………………………………………
第篇 湷觥 FC 程式設計
假设你买了一个整厂整线计划,包括仓贮、物料、MIS、生管,各个部门之间的搭配也
都建立起来了,包含在整厂整线计划内。这个厂原先是为了生产葡萄酒,现在改变主意
要生产白兰地,难道整个厂都不能用了吗?不!只要把进货原料改一改、发酵程序改一
改、瓶装程序改一改、整个厂的其它设备以及设备与设备之间的联机配合(这是顶顶重
要的)都可以再利用。物料之后到生管,装瓶之后到仓贮,仓贮之后到出货,再加上MIS
监控全厂,这些程序都是不必改变的。
一个整厂整线计划,每一单元之间的联机沟通,合作关系,都已经建立起来,是一种建
构好的运作模式。抽换某个单元的性质或部份性质,并不影响整体操作。「整厂整线」
最重要最有价值的是各单元之间的流程与控制。
反映到对象导向程序设计里头,Application Framework 就是「整厂整线规划」,Application
Framework 提供的类别就是上述工厂中一个一个的单元。最具价值的就是各类别之间的
交互运作模式。
虽然文件读写(此动作在MFC 称为Serialize)单元必须改写以符合个人所需,但是单
元与单元之间的关系依然存在而且极富价值。当使用者在程序中选按【File/Open 】或
【File/Save 】,主框窗口自动通知Document 对象(内存资料),引发Serialization 动
作;而你为了个人的需求,改写了这个Serialize 虚拟函数。你对MFC 的改写范围与程度,
视你的程序有多么特异而定。
可是如果酿酒厂想改装为炼钢厂?那可就无能为力了。这种情况不会出现在软件开发
上,因为软件的必备功能使它们具有相当的相似性(尤其Windows 又强调接口一致性) 。
好比说程序想支持MDI 接口,想支持OLE,这基本上是超越程序之专业应用领域之外的
一种大格局,一种大架构,最适合Application Framework 发挥。
很明显,Application Framework 是一组超级的类别库。能够被称为Framework 者必须其
中的类别性质紧密咬合,互相呼应。因此你也就可以想象,Framework 所提供的类别是
一伙的,不是单片包装的。你把这伙东西放入程序里,你也就得乖乖遵循一种特定的
(Application Framework 所规定的)程序风格来进进程序设计工作。但是侯捷也告诉我
316
…………………………………………………………Page 379……………………………………………………………
第5章 總觀Application Framework
们,这是福利不是约束。
别人怎么说
其它人又怎么看Application Framework ?我将胪列数篇文章中的相关定义。若将原文译
为中文,我恐怕力有未逮辞不达意,所以列出原文供你参考。
1985 年,Apple 公司的MacApp 严格而系统化地定义出做为一个商业化Application
Framework 所需要的关键理念:
The key ideas of a mercial application framework : a generic app on steroids that
provides a large amount of general…purpose functionality within a well…planned; well
tested; cohesive structure。
*cohesive 的意思是强而有力、有凝聚力的。
*steroid 是类固醇。自从加拿大100 公尺名将班强生在汉城奥运吃了这药物而夺得金牌并打破世
界记录,相信世人对这个名称不会陌生(当然强生的这块金牌和他的世界记录后来是被取消的)。
类固醇俗称美国仙丹,是一种以胆固醇结构为基础,衍生而来的荷尔蒙,对于发炎红肿等症状有极
速疗效。然而因为它是透过抑制人类免疫系统而得到疗效,如果使用不当,会带来极不良的副作用。
运动员用于短时间内增强身体机能的雄性激素就是类固醇的一种,会影响脂肪代谢,服用过量会导
至极大的副作用。
基本上MacApp 以类固醇来比拟Application Framework 虽是妙喻,但类固醇会对人体产
生不好的副作用而Application Framework 不会对软件开发产生副作用…除非你认为不能
随心所欲写你的码也算是一种副作用。
317
…………………………………………………………Page 380……………………………………………………………
第篇 湷觥 FC 程式設計
是:
Apple 更一步更明确地定义一个Application Framework
an extended collection of classes that cooperate to support a plete application