/inc/class/Shopping/Cart.asp
<%
' 購物車
Class Shopping_Cart
Private List
Private Fields
' 物件初始化
Private Sub Class_Initialize()
Set List = Server.CreateObject("Scripting.Dictionary")
Set Fields = Server.CreateObject("Scripting.Dictionary")
Fields.Add "Amount", 0
End Sub
' 加入商品
Public Sub AddProduct(oProduct)
List.Add List.Count, oProduct
End Sub
' 更新購物車
Public Sub Update()
Dim oProduct
Fields("Amount") = 0
For Each oProduct In List.Items
oProduct.Refresh
Fields("Amount") = Fields("Amount") + oProduct.GetField("SubTotal")
Next
End Sub
' 取得總金額
Public Function GetAmount()
GetAmount = Fields("Amount")
End Function
' 物件結束
Private Sub Class_Terminate()
Set List = Nothing
Set Fields = Nothing
End Sub
End Class
%>
/inc/class/Shopping/Product.asp
<%
' 商品
Class Shopping_Product
Private Fields
Private Sub Class_Initialize()
Set Fields = Server.CreateObject("Scripting.Dictionary")
Fields.Add "Price", 0
Fields.Add "Quantity", 0
Fields.Add "SubTotal", 0
End Sub
Private Sub Class_Terminate()
Set Fields = Nothing
End Sub
Public Sub SetField(sName, vValue)
If Fields.Exists(sName) Then
Fields(sName) = vValue
End If
End Sub
Public Function GetField(sName)
GetField = Null
If Fields.Exists(sName) Then
GetField = Fields(sName)
End If
End Function
Public Sub Refresh()
Fields("SubTotal") = Fields("Price") * Fields("Quantity")
End Sub
End Class
%>
以下是一個簡單的測試:
12345678910111213141516171819
<!-- #include virtual="/inc/class/Shopping/Cart.asp" -->
<!-- #include virtual="/inc/class/Shopping/Product.asp" -->
<%
Dim oCart : Set oCart = New Shopping_Cart
Dim oP1 : Set oP1 = New Shopping_Product
Dim oP2 : Set oP2 = New Shopping_Product
Dim oP3 : Set oP3 = New Shopping_Product
oP1.SetField "Price", 100
oP1.SetField "Quantity", 1
oP2.SetField "Price", 120
oP2.SetField "Quantity", 2
oP3.SetField "Price", 150
oP3.SetField "Quantity", 1
oCart.AddProduct oP1
oCart.AddProduct oP2
oCart.AddProduct oP3
oCart.Update
Response.Write oCart.GetAmount
%>
序列化及反序列化
這裡說的序列化其實不是真的序列化,只是我找不到好的名詞來說明。之前提過利用 Class 關鍵字所產生出來的物件是不能存在 Session 中的,因此我會利用 Dictionary 這種用 Server.CreateObject 所產生出來的物件來存放物件資訊。
/inc/class/Shopping/Product.asp
<%
' 商品
Class Shopping_Product
Private Fields
' ... 略 ...
Public Function Serialize()
Set Serialize = Fields
End Function
Public Function Unserialize(oFields)
Set Fields = oFields
End Function
End Class
%>
/inc/class/Shopping/Cart.asp
<%
' 購物車
Class Shopping_Cart
Private List
Private Fields
' ... 略 ....
Public Function Serialize()
Dim oFields : Set oFields = Server.CreateObject("Scripting.Dictionary")
Dim oItems : Set oItems = Server.CreateObject("Scripting.Dictionary")
Dim oProduct
<strong>For Each oProduct In List.Items</strong>
<strong>oItems.Add oItems.Count, oProduct.Serialize</strong>
<strong>Next</strong>
<strong>oFields.Add "Items", oItems</strong>
oFields.Add "Amount", Fields("Amount")
Set Serialize = oFields
Set oItems = Nothing
Set oFields = Nothing
End Function
Public Sub Unserialize(oSerializedFields)
If oSerializedFields Is Nothing Then Exit Sub
<strong>Set List = Server.CreateObject("Scripting.Dictionary")</strong>
Dim oItem
Dim oProduct
For Each oItem In oSerializedFields("Items").Items
<strong>Set oProduct = New Shopping_Product</strong>
<strong>oProduct.Unserialize oItem</strong>
List.Add List.Count, oProduct
Next
Fields("Amount") = oSerializedFields("Amount")
End Sub
End Class
%>
用法如下:
123456789101112131415161718192021
<!-- #include virtual="/inc/class/Shopping/Cart.asp" -->
<!-- #include virtual="/inc/class/Shopping/Product.asp" -->
<%
Dim oCart : Set oCart = New Shopping_Cart
Dim oP1 : Set oP1 = New Shopping_Product
Dim oP2 : Set oP2 = New Shopping_Product
Dim oP3 : Set oP3 = New Shopping_Product
oP1.SetField "Price", 100
oP1.SetField "Quantity", 1
oP2.SetField "Price", 120
oP2.SetField "Quantity", 2
oP3.SetField "Price", 150
oP3.SetField "Quantity", 1
oCart.AddProduct oP1
oCart.AddProduct oP2
oCart.AddProduct oP3
oCart.Update
Set Session("Cart") = oCart.Serialize
Dim oNewCart : Set oNewCart = New Shopping_Cart
oNewCart.Unserialize Session("Cart")
%>
<%
Dim oItems : Set oItems = Server.CreateObject("Scripting.Dictionary")
Dim oItem
Dim oField
While Not oTempRS.EOF
Set oItem = Server.CreateObject("Scripting.Dictionary")
' 將所有欄位放到 oItem 中
For Each oField In oTempRS.Fields
oItem.Add oField.Name, oField.Value
Next
oItems.Add oItems.Count oItem
Set oItem = Nothing
Wend
Response.Write oItems(0)("Attr1") & vbCrLf
Response.Write oItems(0)("Attr2") & vbCrLf
Response.Write oItems(1)("Attr1") & vbCrLf
Response.Write oItems(1)("Attr2") & vbCrLf
%>
總結
雖然 ASP (VBScript) 在物件導向上的機制不如 ASP (JScript) 來得先進,但是以上的技巧還是能夠解決多數的問題。這些技巧都是我在開發專案時所得到的心得,如果有更多有趣的方法,也歡迎大家分享。