ASP 本身是不存在類這一概念的,這里所說的類為 ASP 支持的腳本語言 VBScript 中Class。VBScript 中類的功能相對比較簡單,不具有真正意義上類的繼承、重載等特性,但它仍然是非常有用的。使得程序組成更加合理,降低了編程的復(fù)雜度。
1.1、什么是類?
類:對象的藍(lán)圖
類是對象的符號表示形式。與藍(lán)圖描述構(gòu)成建筑的項一樣,類以同樣的方式描述組成對象的屬性、方法和事件。就像一副藍(lán)圖可以用于建成多座建筑一樣,一個類 也可以用于根據(jù)需要創(chuàng)建多個對象。就像藍(lán)圖定義使用建筑的人可以訪問建筑的哪些部分一樣,類也可以通過封裝來控制用戶對對象項的訪問。
類和對象
“類”和“對象”這兩個術(shù)語有時互換使用,但實際上,類描述對象的“結(jié)構(gòu)”,而對象是類的可用“實例”。每個實例都是其類的一個精確而又不同的副本。由于對象是類的實例,所以創(chuàng)建對象的操作稱為“實例化”。
如果使用藍(lán)圖類比,類是藍(lán)圖,對象就是基于該藍(lán)圖的建筑。通常情況下,更改一個對象中的數(shù)據(jù)不會更改任何其他對象中的數(shù)據(jù)。
封裝
“封裝”是包含和控制對一組關(guān)聯(lián)項的訪問的能力。類提供一個最通用的方式來封裝項。在下面的示例中,BankAccount 類封裝描述銀行帳戶的方法、字段和屬性。
如果沒有封裝,您就要聲明單獨的過程和變量來存儲和管理銀行帳戶信息,并且要一次處理多個銀行帳戶就會比較困難。通過封裝,您可以將 BankAccount 類中的數(shù)據(jù)和過程作為一個單元來使用。您可以同時處理多個銀行帳戶而不會混淆,因為每個帳戶都由該類的一個唯一實例來表示。
封裝還使您可以控制如何使用數(shù)據(jù)和過程??梢允褂迷L問修飾符(如 Private 或 Public )來防止外部過程執(zhí)行類方法或讀取和修改屬性和字段中的數(shù)據(jù)。您應(yīng)該將類的內(nèi)部詳細(xì)信息聲明為 Private 以防止它們在類的外部使用;這種技術(shù)被稱為“數(shù)據(jù)隱藏”,是對帳戶余額等客戶信息的保護(hù)方式。
封裝的一個基本規(guī)則是只能通過 Property 過程或方法來修改或檢索類數(shù)據(jù)。隱藏類的實現(xiàn)詳細(xì)信息可以防止這些類被以不希望的方式使用,并使您在以后修改這類項時沒有兼容性問題方面的風(fēng)險。例 如,BankAccount 類的更高版本可以更改 AccountBalance 字段的數(shù)據(jù)類型,而不會破壞依賴于此字段擁有特定數(shù)據(jù)類型的其他應(yīng)用程序。
1.2、如何創(chuàng)建一個簡單的類?
ASP 中創(chuàng)建一個類由 Class 語句聲明:
引用內(nèi)容
Class 語句
聲明一個類的名稱,以及組成該類的變量、屬性和方法的定義。
Class name
statements
End Class
參數(shù)
name
必選項。Class 的名稱;遵照標(biāo)準(zhǔn)的變量命名約定。
statements
必選項。一個或多個語句,定義了 Class 的變量、屬性和方法。
說明
在 Class 塊中,成員通過相應(yīng)的聲明語句被聲明為 Private 或 Public。被聲明為 Private 的將只在 Class 塊內(nèi)是可見的。被聲明為 Public 不僅在 Class 塊的內(nèi)部是可見的,對 Class 塊之外的代碼也是可見的。沒有使用 Private 或 Public 明確聲明的被默認(rèn)為 Public。 在類的塊內(nèi)部被聲明為 Public 的過程 (Sub 或 Function)將成為類的方法。Public 變量將成為類的屬性,同使用 Property Get、Property Let 和 Property Set 顯式聲明的屬性一樣。 類的缺省屬性和方法是在它們的聲明部分用 Default 關(guān)鍵字指定的。關(guān)于如何使用該關(guān)鍵字,請參考單獨的聲明語句主題。
示例:一個簡單的 ASP Class 代碼
view plaincopy to clipboardprint?Class TestClass
Sub PrintHello() Response.Write
"Hello World!" End Sub End Class
1.3、如何實例化一個類?
view plaincopy to clipboardprint?Dim objClass
' 定義一個類引用對象變量 Set objClass =
New TestClass
' 創(chuàng)建類引用對象 ' 對象名稱后加點,再跟成員變量、屬性或函數(shù),表示調(diào)用該對象的成員變量、屬性或函數(shù) ' 這里屏幕將顯示 Hello World! objClass.PrintHello
Set objClass =
Nothing ' 釋放對象
ASP 類里不能重載構(gòu)造函數(shù),所以我們不能使用類似于 Set obj = New TestClass("param") 的語句來創(chuàng)建類。
在 ASP 中使用 Set 語句來創(chuàng)建\銷毀類對象,有關(guān) Set 語句的更多信息請參看 VBScript 幫助文檔。
1.4、ASP 類事件(構(gòu)造函數(shù)、析構(gòu)函數(shù))
引用內(nèi)容
Initialize 事件
在創(chuàng)建類的實例時發(fā)生此事件。
Private Sub Class_Initialize()
語句
End Sub
當(dāng)類初始化時,statements部分由零個或多個將要運行的代碼語句組成。
Terminate 事件
在所關(guān)聯(lián)的類的實例終止時發(fā)生此事件。
Private Sub Class_Terminate()
語句
End Sub
當(dāng)類初始化時,statements 部分由零個或多個將要運行的代碼語句組成。
示例:
view plaincopy to clipboardprint?Class TestClass
' 該函數(shù)為構(gòu)造函數(shù),在使用 Set 創(chuàng)建對象時自動執(zhí)行 Private Sub Class_Initialize
' 設(shè)置 Initialize 事件。 ResPonse.Write(
"TestClass started")
End Sub ' 該函數(shù)為析構(gòu)函數(shù),在使用 Set 釋放對象時自動執(zhí)行 Private Sub Class_Terminate
' 設(shè)置 Terminate 事件。 ResPonse.Write(
"TestClass terminated")
End Sub End Class Dim objT
Set objT =
New TestClass
' 創(chuàng)建一個 TestClass 實例。 Set objT =
Nothing ' 刪除實例。
執(zhí)行以上程序屏幕將顯示:TestClass startedTestClass terminated
1.5、ASP 類成員變量、成員函數(shù)
ASP 類中成員變量(函數(shù))有“公有”、“私有”之分,分別使用 Public、Private 語句來定義。
引用內(nèi)容
Dim 語句
聲明變量并分配存儲空間。
Dim varname[([subscripts])][, varname[([subscripts])]] . . .
Public 語句
定義公有變量并分配存儲空間。在 Class 塊中定義私有變量。
Public varname[([subscripts])][, varname[([subscripts])]] . . .
Private 語句
定義私有變量并分配存儲空間。在 Class塊中定義私有變量。
Private varname[([subscripts])][, varname[([subscripts])]] . . .
參數(shù)
varname
變量的名稱;遵循標(biāo)準(zhǔn)變量命名約定。
subscripts
數(shù)組變量的維數(shù),最多可以聲明 60 維的數(shù)組。subscripts 參數(shù)使用下列語法:
upper [, upper] . . .
數(shù)組的下界總是 0。
注意 在過程中使用 Private 語句時,通常將 Private 語句放在過程的開始處。
用 Dim 聲明的 Script 級變量可用于腳本中的所有過程,過程級變量只能用于過程中。
Public語句變量可用于全部腳本中的所有過程。
Private 語句變量只能在聲明該變量的腳本中使用。
如沒有顯式指定使用 Public或 Private,則 Function、Sub 過程默認(rèn)為公用,即它們對于腳本中的所有其他過程是可見的。
有關(guān)公有、私有的更多信息請參看 VBScript 幫助文檔。
示例:公有成員變量、私有成員變量、公有成員函數(shù)、私有成員函數(shù)
view plaincopy to clipboardprint?Class TestClass
Dim PublicParam
' 用 Dim 申明公有成員變量 Private PrivateParam
' 用 Private 申明私有成員變量 'PublicParam = "公有" ' 不能在 Class 標(biāo)記以內(nèi),類函數(shù)以外為成員變量賦值,否則報語法錯誤 'Const intMax = 5 ' 不能在 Class 標(biāo)記以內(nèi),類函數(shù)以外使用 Const,否則報語法錯誤 ' 該函數(shù)為構(gòu)造函數(shù),在使用 Set 創(chuàng)建對象時自動執(zhí)行 Private Sub Class_Initialize
' 設(shè)置 Initialize 事件。 ' 在這里可以為成員變量賦值 PublicParam =
"公有" PrivateParam =
"私有" End Sub ' 該函數(shù)為析構(gòu)函數(shù),在釋放對象時自動執(zhí)行 Private Sub Class_Terminate
' 設(shè)置 Terminate 事件。 ResPonse.Write
"釋放對象" End Sub '公有成員函數(shù)(過程),這里可不寫 Public 語句 '成員函數(shù)(過程)不需要也不能申明 Public Sub PrintParam(i)
If i = 1
Then Call PrintPublicParam()
ElseIf i = 2
Then Call PrintPrivateParam()
End If End Sub '私有成員函數(shù)(過程),比公有成員函數(shù)(過程)多一個 Private 語句 Private Sub PrintPublicParam() Response.Write PublicParam
End Sub Private Sub PrintPrivateParam() Response.Write PrivateParam
End Sub End Class Dim objT
Set objT =
New TestClass
' 創(chuàng)建實例后自動調(diào)用 Class_Initialize 函數(shù),為 PublicParam、PrivateParam 賦值 Response.Write objT.PublicParam
' 輸出:公有 'Response.Write objT.PrivateParam ' 將發(fā)生錯誤,PrivateParam 為私有變量 '賦新值 objT.PublicParam =
"新的公有" 'objT.PrivateParam = "新的私有" ' 錯誤,同上 objT.PrintParam(1)
' 輸出 PublicParam 的值:新的公有 objT.PrintParam(2)
' 輸出 PrivateParam 的值:私有 '將發(fā)生錯誤,私有函數(shù) 'objT.PrintPublicParam 'objT.PrintPrivateParam Set objT=
Nothing
1.6、ASP 類屬性
類對外公開一個屬性(變量)時有兩種做法:
1、使用 Public 聲明變量,這樣在外部就可以直接讀寫這個變量。
2、 使用 Private 聲明變量,然后使用 Property Let / Property Get 過程對外公開這個屬性(只寫/只讀),在 Property 過程中可加入數(shù)據(jù)合法性驗證代碼,任何讀寫這個屬性的外部過程都必須先通過 Property 過程的合法性驗證,這就是所謂的封裝,使得類更加強健。
事實上即使我們使用 Public 聲明屬性,VB 在后臺總是用第二種方法進(jìn)行處理這個屬性。
當(dāng)這個變量是一個對象變量(Object)時,使用 Property Set 過程來引用。
有關(guān) Property Let / Property Get / Property Set 語句的更多信息請參看 VBScript 幫助文檔。
引用內(nèi)容
Property Let 語句
在 Class 塊中,聲明名稱、參數(shù)和代碼等,它們構(gòu)成了賦值(設(shè)置)的 Property 過程的主體。
[Public | Private] Property Let name (
[arglist,] value
)
[statement]
[Exit Property]
[statement]
End Property
參數(shù)
Public
表明 Property Let 過程可以被所有腳本中的其他所有過程訪問。
Private
表明 Property Let 過程只能被定義之的 Class 塊內(nèi)的其他過程訪問。
name
Property Let 過程的名稱;遵守標(biāo)準(zhǔn)的變量命名規(guī)則,區(qū)別僅僅在于其名稱可以與相同 Class 塊中的 Property Get 或 Property Set 過程相同。
arglist
該 變量列表代表了在調(diào)用時被傳遞到 Property Let 過程的參數(shù)。多個參數(shù)之間用逗號隔開。Property Let 過程的每個參數(shù)的名字必須與 Property Get 過程中的相應(yīng)參數(shù)相同。此外, Property Let 過程的參數(shù)比相應(yīng)的 Property Get 過程總要多一個。該參數(shù)為被賦予屬性的值。
value
該變量中包含要賦予屬性的值。當(dāng)過程被調(diào)用時,該參數(shù)將出現(xiàn)在調(diào)用表達(dá)式的右側(cè)。
statement
任意的一組語句,將在 Property Let 過程的主體內(nèi)執(zhí)行。
注意每個 Property Let 語句必須為所定義的屬性定義至少一個參數(shù)。該參數(shù)(在存在多個參數(shù)時的最后一個參數(shù))包含了當(dāng) Property Let 語句被調(diào)用時要賦予屬性的值。該參數(shù)在前面的語法中被稱為value。
說明
如果未明確地使用 Public 或 Private進(jìn)行指定,Property Let 過程被缺省設(shè)置為公有的,即它們對于腳本內(nèi)的其他所有過程都是可見的。Property Let過程中的局部變量的值在不同的過程調(diào)用之間是不被保存的。
在其他任何過程(例如 Function 或 Property Get)的內(nèi)部不能夠定義 Property Let 過程。
Exit Property 語句將導(dǎo)致立即從 Property Let 過程中退出。程序?qū)恼{(diào)用 Property Let 過程的語句之后的點繼續(xù)執(zhí)行。Exit Property 語句可以出現(xiàn)在 Property Let 過程中的任何位置,次數(shù)不限。
與 Function 和 Property Get 過程類似,Property Let 過程是一個單獨的過程,它可以接受參數(shù),執(zhí)行一系列的語句,還可以改變參數(shù)的值。不過,與Function 和 Property Get 過程不同的是,它們兩者都返回一個值,而Property Let過程只能用于屬性賦值表達(dá)式的左側(cè)。
示例:一個簡單的屬性讀寫
view plaincopy to clipboardprint?Class TestClass
Private strName
Private intAge
Private Sub Class_Initialize strName =
"張三" ' 設(shè)置默認(rèn)姓名 intAge = 18
' 設(shè)置默認(rèn)年齡 End Sub ' 屬性只寫 Property Let Name(p) strName = p
End Property ' 屬性只讀 Property Get Name() Name = strName
End Property Property Let Age(i)
' 若年齡范圍介于[0-100]則賦值,否則置為-1 If i >= 0
And i <= 100
Then intAge = i
Else intAge = -1
End If End Property Property Get Age() Age = intAge
End Property End Class Dim objT
Set objT =
New TestClass Response.Write objT.Name
' 輸出:張三 Response.Write objT.Age
' 輸出:18 objT.Name =
"李四" ' 設(shè)置姓名 objT.Age = 20
' 設(shè)置年齡 Response.Write objT.Name
' 輸出:李四 Response.Write objT.Age
' 輸出:20 objT.Name =
"王五" ' 設(shè)置姓名 objT.Age = 101
' 設(shè)置年齡 Response.Write objT.Name
' 輸出:王五 Response.Write objT.Age
' 輸出:-1 Set objT =
Nothing
1.7、ASP 多類組合使用實現(xiàn)復(fù)雜應(yīng)用
VBS 語言是基于對象而非面向?qū)ο螅瑳Q定了其類不支持繼承、重載、派生等特性。所以在實現(xiàn)復(fù)雜應(yīng)用時我們只能使用類組合來實現(xiàn)。
示例:一個簡單的類組合
view plaincopy to clipboardprint?Class cFish
Sub Swim() Response.Write
"海闊憑魚躍" End Sub End Class Class cBird
Sub Fly() Response.Write
"天高任鳥飛" End Sub End Class Class Animal
Dim Fish
Dim Bird
Private Sub Class_Initialize()
Set Fish =
New cFish
Set Bird =
New cBird
End Sub Private Sub Class_Terminate()
Set Fish =
Nothing Set Bird =
Nothing End Sub End Class Dim objAnimal
Set objAnimal =
New Animal objAnimal.Fish.Swim()
' 輸出:海闊憑魚躍 objAnimal.Bird.Fly()
' 輸出:天高任鳥飛 Set objAnimal =
Nothing