未命名的默认属性

Tri*_*ick 5 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")
Run Code Online (Sandbox Code Playgroud)

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

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")
%>
Run Code Online (Sandbox Code Playgroud)

Tho*_*ith 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
Run Code Online (Sandbox Code Playgroud)

用法:dim s: set s = new StringClass s()= "Hello, world!" ' s.value() = "你好,世界!" Response.Write ' 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)
Run Code Online (Sandbox Code Playgroud)

第二个示例可能就是您正在寻找的,使用默认属性来实现集合,但值得查看第一个示例,使用默认属性来实现包装类的自动拆箱。