陳南南
(廈門大學嘉庚學院, 福建 廈門 363105)
在面向過程的結構化編程中,數(shù)據(jù)傳遞通常以函數(shù)間的參數(shù)傳遞方式實現(xiàn)。但在面向?qū)ο蟮氖录?qū)動機制的編程模式中,由于類的存在,使得數(shù)據(jù)更多地是在對象間進行傳遞。特別是在多窗體程序中,窗體間的數(shù)據(jù)傳遞更加頻繁。因此,如何規(guī)范安全地實現(xiàn)不同對象間的數(shù)據(jù)傳遞成為關鍵。
在面向?qū)ο缶幊讨?,本類中的函?shù)參數(shù)傳遞方法與面向過程的編程方法類似,本文就不進行闡述了。為了更直觀地了解數(shù)據(jù)在不同對象間的傳遞,下文以一個基于C#的多窗體小程序為例,分析程序中出現(xiàn)的
幾種數(shù)據(jù)傳遞方法。如圖1所示,F(xiàn)orm1中,點擊字號按鈕后,顯示Form2窗體,由該窗體中的滑動條控制Form1中標簽控件中的文本字號,滑動條當前value值為標簽控件中當前字號大小值。這個小實例雖然簡單,但其中包含了幾種典型的數(shù)據(jù)傳遞方式,這幾種方式可以分成兩個階段:主窗體向從窗體傳遞、從窗體向主窗體傳遞。
圖1 實例截圖
Form1與Form2分屬不同的類,在不同的類對象間進行參數(shù)傳遞,主要有以下幾種方式。
在類定義過程中定義一個靜態(tài)變量,在不同類對象中應用時可以直接用類名引用該變量,這種方式實現(xiàn)簡單,但不符合面向?qū)ο蟮姆庋b思想,而且不同的類對象只能共用該變量,無“個性”。在本例中不適用。
本例中,F(xiàn)orm2顯示時需要接收主窗體傳遞過來的主窗體對象參數(shù)以及標簽當前字號值。在Form2中設置一個public的有參數(shù)構造函數(shù)。
在Form1中點擊字號按鈕創(chuàng)建Form2對象時,在按鈕單擊事件處理函數(shù)中通過構造函數(shù)傳遞參數(shù),F(xiàn)orm2 f2=new Form2(this,(int)label1.Font.Size)。
使用構造函數(shù)傳遞參數(shù)實現(xiàn)簡單,適合與傳遞對象建立時所需的初始值。但這種方式只能是一次性傳遞,下次再用構造函數(shù)傳遞參數(shù)時,傳遞的目標是一個新的對象,而不是原來的從窗體了。
當需要多次從主窗體中接收數(shù)據(jù)時,可以在從窗體中定義一個public變量,在主窗體中用對象名.變量名的格式進行賦值傳遞,但這種方式不符合面向?qū)ο缶幊趟枷胫蟹庋b性原則,且不安全。所以可以在從窗體中定義一個public類型的可讀寫屬性,在主窗體中用對象名.屬性名的格式進行讀寫設置,具體實現(xiàn)方法在本例中不做詳細實現(xiàn)。
在從窗體創(chuàng)建并顯示后,根據(jù)滑動條的左右滑動,修改主窗體中標簽文本字號,這就需要從窗體向主窗體傳遞滑動條的Value屬性值。有兩種實現(xiàn)方法:
將主窗體Form1中的標簽Label1控件的modifiers屬性由Private改為Public,這樣就可以在從窗體的相應事件處理函數(shù)中對標簽控件的Font屬性進行直接賦值修改。
但從面向?qū)ο蟪绦虻姆庋b性及安全性考慮,隨意修改類成員的訪問權限是不可靠的。所以最佳辦法應該利用委托與事件的消息訂閱機制來傳遞數(shù)據(jù)。
委托與事件是面向?qū)ο缶幊趟枷胫械闹匾拍钪?,也是最不易理解的概念之一。委托在功能上它類似C語言的函數(shù)指針,目的是通過創(chuàng)建委托類型對象去調(diào)用函數(shù)。而事件則是一種特殊的委托,事件能完成的委托也能夠完成,但事件的封裝性及安全性要求更高,是一種特制的更為專業(yè)化的委托。二者的主要區(qū)別在于:第一,事件只能在本類以外用“+=”和“-=”去訂閱/取消訂閱代理,委托不管在本類外部還是內(nèi)部都可以用“+=”、“-=”和“=”訂閱 /取消訂閱代理;第二,事件只能在本類內(nèi)部“觸發(fā)”,委托不管在本類內(nèi)部還是外部都可以“調(diào)用”。即:事件,只有本類才能激發(fā)這個事件。
C#是面向?qū)ο蟮氖录?qū)動的編程工具,.net Framework的事件機制使得編程更加快捷簡便。大部分初學者在使用系統(tǒng)控件的各種事件時都熟悉得很快,但在對自定義事件的具體定義、訂閱以及觸發(fā)過程卻往往一知半解。下面我們就利用數(shù)據(jù)傳遞過程簡單介紹事件的處理步驟。
在本例中當從窗體Form2中的滑動條發(fā)生滑動后,立即向主窗體發(fā)生當前value屬性值作為標簽字號,因此需要首先定義一個委托類型,然后在Form2中定義一個關于該委托類型的事件,并在滑動條的滑動事件處理過程中觸發(fā)該事件。
public delegate void sendfontsize(int fs);//聲明委托,代表無返回值,參數(shù)為整型的函數(shù)
public partial class Form2:Form
{public event sendfontsize send;//定義事件,為上述委托類型
由于C#的開發(fā)工具Visual Studio功能過于強大,在方便我們編程工作的同時,也隱藏了許多相對基礎的底層概念及操作,使得許多初學者對面向?qū)ο蟮脑S多概念更難以理解其中的具體定義及使用過程,希望本文能對讀者有所幫助,加深對相關概念的理解。
[1](美)Stephen C.Perry著.C#和.NET核心技術[M].肖斌,王小振等譯.北京:機械工業(yè)出版社,2007.
[2]明日科技編著.Visual C#開發(fā)技術大全[M].北京:人民郵電出版社,2007.
[3]蘇杭麗.C#中數(shù)據(jù)傳遞方式的教學模型設計[J].計算機時代,2011,(03).