2014-01-10 4 views
6

定数付きのVBスクリプトクラスを作成しようとしましたが、800A03EAエラーが発生しました。それはVBSバグですか? OOPの基本ルールではないのですか?Constant inside class

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 customer 
    Private MAX_LEN 
    Private Name 

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

    ... 
End Class 

:あなたは、インスタンス化(すなわちClass_Initialize中)の間に初期化するプライベートメンバ変数を使用することによって、問題を回避することができます。 Ekkehard.Hornerが正しく指摘したように

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 

しかし、値は依然としてオブジェクト内部コードによって変更することができます。不変性がこの値の主な要件であれば、それをグローバル定数として実装する必要があります。

+4

IMOでは、ドキュメントにはクラス内に表示される可能性のあるすべてのステートメントがリストされていると書かれています。私はその文書を3回読みましたが、それはリストが網羅的であることを示していません。より正確なステートメントは、マイクロソフトがそれを省略することによって多くを暗示したということです。もしそうなら、これはそのような省略の長いリストに加わる。自分の文書を書くためにプログラマーに任せるべきではありません理由です。それから、重要な何かを省略する危険なほど簡単です。 –

4

(おそらくゲッター付き)プライベート変数はあなたに読み取り専用で、クラスの外から値を与えるが、クラス内部のコードでは、まだその値を変更することができます。

だから、地球のConst(おそらく「名前空間」名前の一部)を使用すると、const性が最も重要である場合は、より良い回避策かもしれません。

5

私はAnsgar Wiechersanswerに同意しますが、別のオプションを提案したいと思います。

不変性は、パフォーマンスよりも重要であるならば、あなたは、Getで値を直接入れて、代わりにクラスレベルの変数の値を参照するためにプロパティを使用することができます。

Class customer 

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

    ... 
End Class