2010-07-06 11 views
5

Dans VBScript, certains objets intégrés utilisent une propriété non nommée. Quelques exemples:Propriété par défaut sans nom

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

Comment puis-je utiliser cette même syntaxe dans mes propres classes?

MISE À JOUR

Voici un travail, par exemple autonome de la façon de le faire, une enveloppe simple pour Scripting.Dictionary. Notez l'utilisation de "Let" pour autoriser la syntaxe d ("key") = "value". Bien sûr, le crédit va à Thom pour fournir la réponse.

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

Répondre

2

Vous devez déclarer une propriété de la classe en tant que propriété par défaut. À titre d'exemple, voici une partie d'une classe wrapper String j'ai écrit:

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 

Utilisation: dim s: s = new set StringClass s() = "Bonjour, monde!" 's.value() = "Bonjour, monde!" 's Response.Write s.value Response.Write()

Vous pouvez également avoir une propriété par défaut paramétrisé:

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) 

Ce deuxième exemple est probablement ce que vous recherchez, en utilisant les propriétés par défaut pour mettre en œuvre collections, mais il vaut la peine de vérifier le premier exemple, en utilisant les propriétés par défaut pour implémenter l'auto-unboxing des classes wrapper.

Questions connexes