|
運(yùn)用屬性過程
Visual Basic 提供下表所列的三種屬性過程。
過程 | 目的 | Property Get | 返回屬性的值 | Property Let | 設(shè)置屬性的值 | Property Set | 設(shè)置對象屬性的值(即,該屬性含有對象引用)。 |
從上表可見,每一個屬性過程都有自己特殊的功能。典型的屬性由一對屬性過程組成:Property Get 檢索屬性的值,Property Let 或 Property Set給屬性賦值。
這些作用在有些情況下可能重疊。有兩類賦值的屬性過程的原因,是因?yàn)閷ο笠觅x給對象變量時,Visual Basic 有特殊的語法:
Dim wdg As Widget
Set wdg = New Widget規(guī)則很簡單:如果有 Set 語句,則 Visual Basic 調(diào)用 Property Set,如果沒有則調(diào)用 Property Let。
提示 返回到經(jīng)典的 Basics 語法,為了正確使用 Property Let 和 Property Set 保持清潔整齊,應(yīng)鍵入 Let x = 4(直到今天 Visual Basic 還支持的語法)而不是 x = 4,。Visual Basic總是根據(jù)賦值類型決定調(diào)用屬性過程— 對于 Let x = 4 調(diào)用 Property Let,對于 Set c1 = New Class1(對象屬性)則調(diào)用 Property Set。
詳細(xì)信息 “編程基礎(chǔ)”中“對象使用”解釋 Set 語句對對象變量的使用。
讀寫屬性下列編碼顯示了典型的讀寫屬性:
'屬性值的私有存儲區(qū)。
Private mintNumberOfTeeth As IntegerPublic
Property Get NumberOfTeeth() As Integer
NumberOfTeeth = mintNumberOfTeeth
End Property
Public Property Let NumberOfTeeth(ByVal NewValue _ As Integer) '(省略驗(yàn)證屬性值代碼。)
mintNumberOfTeeth = NewValue
End Property存儲了屬性值的私有變量名,由作用域前綴 (m),類型前綴 (int) 和名稱 (NumberOfTeeth) 組成,其中,作用域前綴 (m) 指明變量是模塊級的。使用屬性相同的名稱可指明該變量和屬性是相關(guān)的。
毫無疑問,已經(jīng)注意到,這里和以前的示例一樣,含有讀寫屬性的屬性過程名必須是相同的。
注意 屬性過程缺省為公共的,因此,如果省略Public 關(guān)鍵詞,則屬性過程仍是公共的。如果想要使屬性為私有(只有對象內(nèi)部才可訪問),必須用 Private關(guān)鍵詞聲明。即使不是必須,最好還是使用 Public 關(guān)鍵詞,因?yàn)檫@可使意圖清楚。
運(yùn)行和播放屬性過程單步運(yùn)行一些屬性過程代碼是有益處的。使用“工程”菜單,打開一個新的 Standard Exe 工程,并增添一個類模塊。如上所示,從 NumberOfTeeth 屬性復(fù)制代碼到 Class1。
切換到 Form1,將下列代碼添加到 Load 事件中:
Private Sub Form_Load() Dim c1 As Class1 Set c1 = New Class1 '賦給新的屬性值。 c1.NumberOfTeeth = 42 '顯示屬性值。 MsgBox c1.NumberOfTeethEnd Sub按 F8 鍵,單步運(yùn)行代碼。注意,當(dāng)屬性被賦值時,運(yùn)行跳到 Property Let,當(dāng)檢索屬性值時,運(yùn)行跳到 Property Get。將會發(fā)現(xiàn),對屬性過程其它組合,重復(fù)做這種練習(xí)是很有用的。
屬性過程對的參數(shù)必須匹配至今所見的屬性過程示例都很簡單,對多數(shù)屬性而言屬性過程也將是這樣。但是,屬性過程可有多個參數(shù)— 甚至可選參數(shù)。多個參數(shù)中最有用的是數(shù)組,下面將討論。
當(dāng)使用多個參數(shù)時,屬性過程對的參數(shù)必須匹配。下表給出了在屬性過程聲明中參數(shù)的要求。
過程 | 聲明語法 | Property Get | Property Get propertyname(1,..., n) As type | Property Let | Property Letpropertyname(1,..., n, n+1) | Property Set | Property Setpropertyname(1,..., n, n+1) |
在 Property 過程中,從第一個參數(shù)到倒數(shù)第二個參數(shù) (1,..., n),必須具有與過程相同的名稱和數(shù)據(jù)類型。就象其它過程類型一樣,列表中必需參數(shù)應(yīng)排在第一個可選參數(shù)之前。
可能注意到,Property Get 過程的聲明比相關(guān)的 Property Let 或 Property Set少一個參數(shù)。Property Get 過程的數(shù)據(jù)類型的聲明必須與 Property Let 或 Property Set 最后一個參數(shù) (n+1) 的數(shù)據(jù)類型一樣。
例如,一個類似二維數(shù)組的屬性的 Property Let 聲明:
Public Property Let Things(ByVal X As Integer, _ByVal Y As Integer, ByVal Thing As Variant) '(省略給數(shù)組元素賦值的代碼。)End PropertyProperty Get 的參數(shù)聲明必須與 Property Let 過程的參數(shù)名稱和數(shù)據(jù)類型相同:
Public Property Get Things(ByVal X As Integer, _ByVal Y As Integer) As Variant '(省略從數(shù)組取值的代碼。)End Property在 Property Set 聲明中的最后參數(shù)的數(shù)據(jù)類型,要么是對象類型,要么是Variant 類型。
參數(shù)匹配圖 9.8 給出了這些參數(shù)匹配規(guī)則的理由。并顯示了 Visual Basic 如何將賦值語句部分與 Property Let 參數(shù)相匹配。
圖 9.8 Property Let 過程的調(diào)用
帶多參數(shù)的屬性過程最常用于創(chuàng)建屬性數(shù)組。
只讀屬性要創(chuàng)建只讀屬性,只須簡單地省略 Property Let 或(對于對象屬性)Property Set。
對象屬性若要創(chuàng)建一個讀寫對象屬性,應(yīng)使用 Property Get 和 Property Set 如:
Private mwdgWidget As WidgetPublic Property Get Widget() As Widget 'Set 語句被用來返回一個對象引用。 Set Widget = mwdgWidgetEnd PropertyPublic Property Set Widget(ByVal NewWidget As Widget) Set mwdgWidget = NewWidgetEnd Property Variants 屬性 Variants 數(shù)據(jù)類型的讀寫屬性是最復(fù)雜的。如下所示,使用三種屬性過程類型:
Private mvntAnything As VariantPublic Property Get Anything() As Variant 'Set 語句只用于包含了對象引用的任何屬性。 If IsObject(mvntAnything) Then Set Anything = mvntAnything Else Anything = mvntAnything End IfEnd PropertyPublic Property Let Anything(ByVal NewValue As Variant) '(省略驗(yàn)證代碼。) mvntAnything = NewWidgetEnd PropertyPublic Property Set Anything(ByVal NewValue As Variant) '(省略驗(yàn)證代碼。) Set mvntAnything = NewWidgetEnd Property在正確環(huán)境中,Property Set 和 Property Let 總是很正常的使用。但是,使用 Property Get 必須考慮以下二種情況:
strSomeString = objvar1.AnythingSet objvar2 = objvar1.Anything在第一種情況中,Anything 屬性包含了字符串,它賦給了 String 變量。在第二個情況中,Anything 屬性包含了對象引用,它被賦給對象變量。
通過使用 IsObject 函數(shù),在返回值之前測試私有 Variants 變量,可對 Property Get 進(jìn)行編程來處理這兩種情況。
自然,當(dāng)屬性包含對象引用時,如果第一條編碼被調(diào)用,將會出現(xiàn)錯誤,但這不是 Property Get 問題,而是使用 Variants 屬性的問題。
僅寫一次屬性屬性過程有幾種可能的組合。所有的組合都是有效的,但有些相對來說不太常用,比如只寫屬性(只有 Property Let,而無 Property Get)。有些則取決于另外的因素,而不是所組合的屬性過程類型。
例如,如本章后“對象模型”所描述的那樣,當(dāng)通過創(chuàng)建一個對象模型在程序中組織對象時,可能想讓該對象能引用包含它的對象。使用 Parent 屬性可這樣做。
當(dāng)對象創(chuàng)建時,應(yīng)設(shè)置 Parent 屬性,但此后,可能想防止其被有意或無意地改變。以下示例顯示了 Account 對象如何使用 Parent 屬性。該屬性指向含有帳號的 Department 對象。
'Parent 屬性要用私有數(shù)據(jù)存儲Private mdeptParent As DepartmentProperty Get Parent() As Department '使用 Set 語句引用對象。
Set Parent = mdeptParentEnd Property'屬性值只能被設(shè)置一次。
Public Property Set Parent(ByVal NewParent _As Department)
If deptParent Is Nothing Then '賦初值。
Set mdeptParent = NewParent
Else
Err.Raise Number:=vbObjectError + 32144,
Description:="Parent property is read-only"
End If
End Property當(dāng)訪問 Account 對象的父對象時,例如通過代碼 strX = acctNew.Parent.Name 獲取部門名稱,Property Get 被用于返回對父對象的引用。
該示例中,編入 Property Set 是為了使 Parent 屬性只能被設(shè)置一次。例如,當(dāng) Department 對象創(chuàng)建一個新的帳號時,可以執(zhí)行代碼 Set acctNew.Parent = Me 設(shè)置屬性。此后,該屬性為只讀的。
詳細(xì)信息 因?yàn)樵?Visual Basic 中窗體是類,故可向窗體添加用戶屬性。請參閱本章前面“定制窗體類”的內(nèi)容。
|
|