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