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