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