2014-01-10 88 views
6

我試着用常量創建一個VB腳本類,並得到800A03EA錯誤。這是一個VBS的錯誤?這不是一個面向對象的基本規則嗎?類內部常量

Class customer 
    ' comment it const and its works 
    const MAX_LEN=70 

    Private Name 

    Private Sub Class_Initialize 
     Name = "" 
    End Sub 

    ' name property. 
    Public Property Get getName 
     getName = Name 
    End Property 

    Public Property Let letName(p_name) 
     Name = p_name 
    End Property 
end class 
+3

這是一個(令人遺憾的)生活事實。 –

回答

11

documentation列出了在類上下文中允許的所有語句。其中不包括Const,所以不支持。您可以解決該問題通過使用您(在Class_Initialize IE)實例化過程中初始化的私有成員變量:

Class customer 
    Private MAX_LEN 
    Private Name 

    Private Sub Class_Initialize 
    MAX_LEN = 70 
    Name = "" 
    End Sub 

    ... 
End Class 

如果該類的實例應該揭露這個值,你可以實現它作爲一個只讀屬性:

Class customer 
    Private MAX_LEN 

    Private Sub Class_Initialize 
    MAX_LEN = 70 
    End Sub 

    'read-only property, so no "Property Let/Set" 
    Public Property Get MaxLength 
    MaxLength = MAX_LEN 
    End Property 

    ... 
End Class 

然而,如Ekkehard.Horner指出正確,則該值仍可以通過對象的內部代碼改變。如果不變性是這個值的主要要求,那麼你應該把它作爲一個全局常量來實現。

+4

IMO,聲明文檔列出了可能出現在類中的所有語句,這是非常有限的。我已經閱讀了三次文檔,並且沒有任何內容表明列表是詳盡無遺的。我認爲更準確的說法是,微軟通過省略它而暗示了這一點。如果是這樣,那麼這加入了一長串這樣的遺漏。這就是爲什麼不應該讓程序員自己寫文檔的原因。忽略重要的東西是非常容易的。 –

4

私有變量(可能帶有getter)爲您提供從類外部只讀的值,但類內部代碼仍然可以更改該值。

因此,在常量最重要的情況下,使用全局常量(可能帶有'名稱空間'名稱部分)可能是更好的解決方法。

5

我同意Ansgar Wiechersanswer,但想提出另一種選擇。

如果不變性比性能更重要,則可以直接在Get中使用該值,並使用該屬性來引用該值而不是類級變量。

Class customer 

    'read-only property, so no "Property Let/Set" 
    Public Property Get MaxLength 
    MaxLength = 70 
    End Property 

    ... 
End Class