Безымянное свойство по умолчанию - PullRequest
5 голосов
/ 06 июля 2010

В 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».Конечно, заслуга Тома в предоставлении ответа.

<%
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 Ответ

2 голосов
/ 07 июля 2010

Вам необходимо объявить свойство класса как свойство по умолчанию.В качестве примера, вот часть класса оболочки 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)

Этот второй пример, вероятно, то, что вы искали, используя defaultсвойства для реализации коллекций, но стоит проверить первый пример, используя свойства по умолчанию для реализации автоматической распаковки классов-оболочек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...