未命名的默认属性

时间:2010-07-06 15:54:00

标签: vbscript class

在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")

如何在我自己的类中使用相同的语法?

更新

这是一个工作的独立示例,说明如何执行此操作,这是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")
%>

1 个答案:

答案 0 :(得分:2)

您需要将类的属性声明为默认属性。举个例子,这是我写的String包装类的一部分:

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

使用方法:     dim s:set s = new 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)

第二个例子可能就是你要找的东西,使用默认属性来实现集合,但是值得检查第一个例子,使用默认属性来实现自动拆箱包装类。