2013-04-28 27 views
1

如何初始化類中的數組屬性?如何初始化以下陣列1:如何初始化ASP經典類中的數組屬性?

class Class1 
    private count 
    private array1 

    private sub class_initialize 
     count  = 0 
     array1(0) = 0 'initialize first element 
    end sub 

end class 

導致錯誤: Microsoft VBScript運行時錯誤 '800a000d' 類型不匹配:數組1'

回答

0

由於改革的班級無法正常工作,ShadowWizards的評論是危險的:

Option Explicit 

class ArrMemberA 
    private count 
    private array1 

    private sub class_initialize 
     count = 0 
     array1 = array() 'initialize array property 
    end sub 

    'to add a new element to array property 
    public sub add(input) 
     redim preserve array1(count + 1) 
     array1(count) = input 
     count = count + 1 
    end sub 

    Public Function toString() 
     toString = "[" & Join(array1, "*") & "]" 
    End Function 
end class 

Class ArrMemberB 
    Private m_a 
    Private Sub Class_Initialize 
    m_a = Array() ' initialize to empty dynamic array 
    End Sub 
    Public Sub add(input) 
    ReDim Preserve m_a(UBound(m_a) + 1) 
    m_a(UBound(m_a)) = input 
    End Sub 
    Public Function toString() 
    toString = "[" & Join(m_a, "*") & "]" 
    End Function 
End Class 

Class ArrMemberC 
    Private m_a() 
    Public Sub add(input) 
    ReDim Preserve m_a(UBound(m_a) + 1) 
    m_a(UBound(m_a)) = input 
    End Sub 
    Public Function toString() 
    toString = "[" & Join(m_a, "*") & "]" 
    End Function 
End Class 

Class ArrMemberD 
    Private m_a() 
    Private m_n 
    Private Sub Class_Initialize 
    m_n = -1 ' initialize to empty ubound 
    End Sub 
    Public Sub add(input) 
    m_n = m_n + 1 
    ReDim Preserve m_a(m_n) 
    m_a(m_n) = input 
    End Sub 
    Public Function toString() 
    toString = "[" & Join(m_a, "*") & "]" 
    End Function 
End Class 

Dim a : Set a = New ArrMemberA 
a.add "zero" 
a.add "one" 
WScript.Echo "a:", a.toString(), "- spurious empty tail element" 

Dim b : Set b = New ArrMemberB 
b.add "zero" 
b.add "one" 
WScript.Echo "b:", b.toString() 

Dim c : Set c = New ArrMemberC 
On Error Resume Next 
c.add "zero" 
WScript.Echo "c:", Err.Description, "- Ubound() fails for the abomination created by 'Private m_a()'" 
On Error GoTo 0 

Dim d : Set d = New ArrMemberD 
d.add "zero" 
d.add "one" 
WScript.Echo "d:", d.toString() 

輸出:

cscript demoarray.vbs 
a: [zero*one*] - spurious empty tail element 
b: [zero*one] 
c: Subscript out of range - Ubound() fails for the abomination created by 'Private m_a()' 
d: [zero*one] 

(a)顯示自己的計數器有風險; (b)這是我的方式; (c)證明「Dim/Private/Public varname()」的結果不能是UBound(); (d)證明'使其工作',你需要你試圖避免的Class_Initialize子類。

+0

謝謝你的回答。你能給我舉一個例子,說明我的課程無法正常工作嗎?我可以將選擇的答案更改爲這一個。 – reformed 2013-08-08 19:48:50

+0

@reformed - 一個案例表明你的類創建了一個虛假的空尾元素的數組,因爲count從0開始,第一個將ReDims加到0 + 1(== 1 ==一個包含索引爲0和1的2個元素的數組(等等)。 – 2013-08-08 20:01:58

1

我想通了:

class Class1 
    private count 
    private array1 

    private sub class_initialize 
     count = 0 
     array1 = array() 'initialize array property 
    end sub 

    'to add a new element to array property 
    public sub add(input) 
     redim preserve array1(count + 1) 
     array1(count) = input 
     count = count + 1 
    end sub 
end class 
+2

你也可以只用'private array1()'然後在'array1 = array()'中不需要'' – 2013-04-28 07:52:58

+0

@ShadowWizard謝謝你的支持 – reformed 2013-04-28 18:58:24