2010-07-06 35 views
5

在VBScript中,某些內置對象使用未命名的屬性。一些示例:未命名的默認屬性

Set Dict = Server.CreateObject("Scripting.Dictionary") 
Set RS = GetEmloyeesRecordSet() 

Dict("Beer") = "Tasty" ' Same as Dict.Item("Beer") = "Tasty" 
Dict("Crude Oil") = "Gross" ' Same as Dict.Item("Crude Oil") = "Gross" 

Response.Write "The First Employee Is: " & RS("Name") ' Same as RS.Fields("Name") 

如何在自己的類中使用相同的語法?

UPDATE

這裏是一個工作,如何做到這一點,一個簡單的包裝了的Scripting.Dictionary單機例子。注意使用「Let」來允許d(「key」)=「value」語法。當然,Thom提供了答案。

<% 
Class DictWrapper 
    Private Dict 

    Private Sub Class_Initialize() 
     Set Dict = Server.CreateObject("Scripting.Dictionary") 
    End Sub 

    Private Sub Class_Terminate() 
     Set Dict = Nothing 
    End Sub 

    Public Property Get Count 
     Count = Dict.Count 
    End Property 

    Public Default Property Get Item(Key) 
     Item = Dict(Key) 
    End Property 

    Public Property Let Item(Key, Value) 
     Dict(Key) = Value 
    End Property 

    Public Sub Add(Key, Value) 
     Dict.Add Key, Value 
    End Sub 

End Class 

Dim d : Set d = New DictWrapper 
d.Add "Beer", "Good" 
Response.Write d("Beer") & "<br>" 
d("Beer") = "Bad" 
Response.Write d("Beer") 
%> 

回答

2

您需要聲明類的默認屬性的屬性。作爲一個例子,這裏有一個字符串包裝類,我寫的一部分:

class StringClass 
    private finished_ 
    private data_ 
    private size_ 

    public function init (val) 
     finished_ = cStr(val) 
     set init = me 
    end function 

    public default property get value 
     if (size_ > 0) then 
      finished_ = finished_ & join(data_, vbNullString) 
      data_ = empty 
      size_ = 0 
     end if 
     value = finished_ 
    end property 

    public property let value (val) 
     data_ = empty 
     size_ = empty 
     init(val) 
    end property 

    public function add (s) 
     size_ = size_ + 1 
     if (isEmpty(data_)) then 
      redim data_(MIN_ARRAY_SIZE) 
     elseif (size_ > uBound(data_)) then 
      redim preserve data_(Float(uBound(data_) * GRANTED_HEAD_ROOM).ceil) 
     end if 
     data_(size_ - 1) = cStr(s) 
    end function 
end class 

用法: 暗淡S:集合S =新StringClass S()= 「你好,世界!」 's.value()=「你好,世界!」 的Response.Write S'的Response.Write s.value()

你也可以有一個參數化的默認屬性:

class ListClass 
    private size_ 
    private data_ 

    private sub CLASS_INITIALIZE 
     size_ = 0 
     data_ = Array() 
     resize_array MIN_ARRAY_SIZE 
    end sub 

    public default property get data (index) 
     if isObject(data) then 
      set data_(index) = data 
     else 
      data_(index) = data 
     end if 
    end property 

    public property let data (index, value) 
     data_(index) = value 
    end property 

    public property set data (index, value) 
     set data_(index) = value 
    end property 

    public function add(datum) 
     size_ = size_ + 1 
     if (size_ > uBound(data_) + 1) then expand_array 

     assign data_(size_ - 1), datum 

     add = datum 
    end function 
end class 

dim l: set l = new ListClass 
l.add("Hello, world!") 
l(0) = "Goodbye, world!" 
Response.Write l(0) 

第二個例子可能就是你要找的人,使用默認屬性來實現集合,但值得檢查第一個示例,使用默認屬性來實現封裝類的自動拆箱。