2010-07-06 6 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"구문을 허용하십시오. 물론 답을 제공 한 톰은 신용을 톰에게 간다.

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

이 두 번째 예는 아마 당신이 찾고 있던 무엇을 컬렉션을 만들지 만 첫 번째 예제를 확인하고 기본 속성을 사용하여 래퍼 클래스의 자동 언 박싱을 구현하는 것이 좋습니다.