面向對象程序設計的兩個重要方面:代碼重用和接口設計,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 1000AW_CENTER
具體動畫方式可通過改變該函數的參數,即可實現動畫顯示效果。
以上辦法看似方便,直觀。但若程序中有多個不同的對話框,要做到界面風格的統一,則要使每個對話框都具有此動畫效果,又由於涉及到不同的資源及操作,必定不可能簡單地從CMyAnimateDlg派生,那是否必須改寫每個對話框類的OnInitDialog。若只是像我們上述的一句操作即可完成的功能倒還容易,但若有另外更多的特殊風格,例如為每個對話框都添加一個狀態欄,工具欄等等,那麼重復繁鎖的代碼該如何避免呢?
其實利用模板技術即可方便地解決這類問題。
首先,我們將CMyAnimatDlg抽象成一個模板。
Template <class T>
Class CMyAnimateDlg public T
public
CMyAnimateDlgCWnd pParent=NULL
Protected
Virtual BOOL OnInitDialog
template <class T>
CMyAnimateDlg<T>CMyAnimateDlgCWnd pParent TpParent
template <class T>
BOOL CMyAnimateDlg<T>OnInitDialog
TOnInitDialog
this->AnimateWindow1000AW_CENTER
return TRUE
這樣在使用對話框時,只需要將原來聲明對象時的對話框,類名改為:CMyAnimateDlg<對話框類名>, 即可使聲明的對話框對象具有動畫顯示效果。
例如:原來程序中的About對話框想具有動畫顯示的效果只需要將原來聲明
CAboutDlg DlgAbout
改為:CMyAnimateDlg<CAboutDlg> DlgAbout
若想為對話框添加狀態欄,只需要在CMyAnimateDlg中添加成員變量:CstatusBarCtrl m_wndStatusBar。再在CMyAnimateDlg<T>OnInitDialog中加入對m_wndStatusBar的創建和初始化操作即可。
相對應地,以後所有對話框類利用此模板聲明的對話框就都具有你所自定義的狀態欄。而且可以通過m_wndStatusBar訪問和修改。以後若想再添加工具欄,只須使用相同的方法即可添加狀態欄和工具欄的代碼在此就不予列出 。這樣一來就簡化了接口設計,充分體現了代碼重用。
以上只是模板技術在簡化程序代碼方面的一點應用,但其功能遠不止如此。這裡只是為大家帶來一些提示,希望能有所啟發。