利用模板技术简化VC中的代码

发表于:2007-07-01来源:作者:点击数: 标签:
面向对象程序设计的两个重要方面:代码重用和接口设计,C++一直是公认在这两方面做得最为出色的语言之一。而良好的接口则是代码重用的坚实基


  面向对象程序设计的两个重要方面:代码重用和接口设计,C++一直是公认在这两方面做得最为出色的语言之一。而良好的接口则是代码重用的坚实基础。接口包含多个层面,大体分为C++代码层面、模块层面、COM层面和应用系统层面。

  认识VC中的模板

  许多初学VC的程序员总感觉VC的代码繁锁,不如VB、Delphi、C++Builder那样简单直观。其实在VC中只要灵活地使用C++面向对象的接口设计手段:多态性、模板、类封装来实现代码重用,便能使代码大大简化和直观。对于多态性和类封装相信许多C++学习者已比较熟悉了,但对于模板进行接口简化却很少应用。这里就为大家说一下应用模板来简化代码层面接口设计实现代码重用。

  模板类对于C++初学者都比较难以理解的。很多时候,一提到模板,就会想起Clist、Carray等数据结构。但实际上模板技术的运用远不止如此。下面举例为大家说明一下使用模板技术来简化程序的代码。

  从实例学做模板

  这里我们想以一个实现以动画风格显示出的对话框为例,探讨代码重用的技巧。为此向大家介绍一个CWnd 的函数:AnimateWindow(DWORD dwtime,DWORD dwflags),该函数能以动画方式显示出窗口,第一个参数为动画效果持续时间,第二个则是动画的方式。具体详细说明可查看VC帮助文档。

  对此,我们可以在对话框类的初始化操作中加入动画显示过程。例如:在CMyAnimateDlg的OnInitDialog中加入下面一句代码:

this->AnimateWindow ?1000?AW_CENTER?

  具体动画方式可通过改变该函数的参数,即可实现动画显示效果。

  以上办法看似方便,直观。但若程序中有多个不同的对话框,要做到界面风格的统一,则要使每个对话框都具有此动画效果,又由于涉及到不同的资源及操作,必定不可能简单地从CMyAnimateDlg派生,那是否必须改写每个对话框类的OnInitDialog。若只是像我们上述的一句操作即可完成的功能倒还容易,但若有另外更多的特殊风格,例如为每个对话框都添加一个状态栏,工具栏等等,那么重复繁锁的代码该如何避免呢?
其实利用模板技术即可方便地解决这类问题。

  首先,我们将CMyAnimatDlg抽象成一个模板。


Template <class T>
Class CMyAnimateDlg ? public T
?
public?
CMyAnimateDlg?CWnd? pParent=NULL??
Protected?
Virtual BOOL OnInitDialog???
??
template <class T>
CMyAnimateDlg<T>??CMyAnimateDlg?CWnd? pParent? ?T?pParent?
?
template <class T>
BOOL CMyAnimateDlg<T>??OnInitDialog??
?
T??OnInitDialog??
this->AnimateWindow?1000?AW_CENTER??
return TRUE?

  这样在使用对话框时,只需要将原来声明对象时的对话框,类名改为:CMyAnimateDlg<对话框类名>, 即可使声明的对话框对象具有动画显示效果。

  例如:原来程序中的About对话框想具有动画显示的效果只需要将原来声明
CAboutDlg DlgAbout?

  改为:CMyAnimateDlg<CAboutDlg> DlgAbout?

  若想为对话框添加状态栏,只需要在CMyAnimateDlg中添加成员变量:CstatusBarCtrl m_wndStatusBar。再在CMyAnimateDlg<T>??OnInitDialog中加入对m_wndStatusBar的创建和初始化操作即可。

  相对应地,以后所有对话框类利用此模板声明的对话框就都具有你所自定义的状态栏。而且可以通过m_wndStatusBar访问和修改。以后若想再添加工具栏,只须使用相同的方法即可?添加状态栏和工具栏的代码在此就不予列出?。这样一来就简化了接口设计,充分体现了代码重用。

  以上只是模板技术在简化程序代码方面的一点应用,但其功能远不止如此。这里只是为大家带来一些提示,希望能有所启发。

  (注:以上代码在VC7、Win2000中调试通过)


原文转自:http://www.ltesting.net