2010-07-06 33 views
5

Trong VBScript, một số đối tượng được dựng sẵn sử dụng thuộc tính chưa đặt tên. Một số ví dụ:Tài sản mặc định không được đặt tên

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

Tôi có thể sử dụng cùng cú pháp này trong lớp học của riêng mình như thế nào?

CẬP NHẬT

Đây là một hoạt động, độc lập ví dụ về làm thế nào để làm điều này, một wrapper đơn giản cho Scripting.Dictionary. Lưu ý việc sử dụng "Let" để cho phép cú pháp d ("key") = "value". Tất nhiên tín dụng đi đến Thom để cung cấp câu trả lời.

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

Trả lời

2

Bạn cần khai báo thuộc tính của lớp làm thuộc tính mặc định. Như một ví dụ, đây là một phần của một lớp String wrapper tôi đã viết:

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 

Cách sử dụng: mờ s: tập s = new StringClass s() = "Hello, world!" 's.value() = "Xin chào, thế giới!" Response.Write s 's.value Response.Write()

Bạn cũng có thể có một tài sản mặc định parametrized:

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) 

ví dụ thứ hai này có lẽ là những gì bạn đang tìm kiếm, sử dụng thuộc tính mặc định để thực hiện bộ sưu tập, nhưng đáng để kiểm tra ví dụ đầu tiên, sử dụng các thuộc tính mặc định để triển khai tự động unboxing các lớp trình bao bọc.

Các vấn đề liên quan