静的メンバー手続きと変数のための宣言指定子。
構文:
記述:
- 静的メンバー手続き
Static メソッドは、メソッドに渡される暗黙の
This インスタンス引数を持っていません。
このため、
Static メソッドは、通常の非メンバー手続きのように使うことができます。(例えば、コールバック手続きポインタを持つことができます。)
Static メソッドの利点は、
typename 名前空間でカプセル化されているため、
typename のインスタンスの
Private または
Protected メンバやメソッドにアクセスする能力を持っていることです。
Static メソッドは、コードのどこでも、直接呼ばれることができます。通常の非メンバー手続きのように、あるいは、型
typename のオブジェクト上で、非静的メソッドと同じ様に。
しかし、いずれの方法も、静的メソッド内からアクセスできる、暗黙的または明示的
This (または、明示的
Base (member access)) がありません。
Static 宣言を持つメンバー手続きでは、
Static を、対応する手続き本体に指定して、コードの可読性を向上させることができます。
- 静的メンバー変数
Static メンバ変数は、作成され、どのオブジェクト構築子とも無関係に、一度だけ初期化されます。
それぞれ個別のオブジェクトのために何度も何度も作成される、非静的 ("instance") メンバー変数とは対照的です。
Static メンバーは、常に
Shared(共有) されています。宣言で
Shared が指定されていない場合でもです。
このため、
Static メンバ変数は、グローバル変数に似ています。
Type 名前空間で宣言されている点だけが異なります。
型の中で宣言された 各
Static メンバー変数は、型の外のどこかに、
Dim 命令文を使って、明示的に割り付けなければなりません。
型の内部の宣言は、プロトタイプで、型宣言を見る、すべてのモジュールから見えます。
型の外側の定義は、
Static メンバー変数を割り付けます。初期化はオプションです。
Static メンバー変数に対して、1つだけ定義ができます:
これは単一のモジュールの中だけで割り付けることができます。複数のモジュールの中ではありません。
これは、
Extern 変数でと同じです。
Static メンバー変数は、型の外側での変数の定義を除いて、メンバー・アクセス・コントロールに従います。
非公開の
Static メンバー変数が、型のメンバー手続きの外部で、明示的に初期化されることになっている場合、初期化子は、定義で提供されなければなりません。
例:
'' 実行時にメンバーによって起動された実際の手続きを設定する方法を示す例。
'' 静的メンバー手続きを用います。
Type _Object
Enum handlertype
ht_default
ht_A
ht_B
End Enum
Declare Constructor( ByVal ht As handlertype = ht_default)
Declare Sub handler()
Private:
Declare Static Sub handler_default( ByRef obj As _Object )
Declare Static Sub handler_A( ByRef obj As _Object )
Declare Static Sub handler_B( ByRef obj As _Object )
handler_func As Sub( ByRef obj As _Object )
End Type
Constructor _Object( ByVal ht As handlertype )
Select Case ht
Case ht_A
handler_func = @_Object.handler_A
Case ht_B
handler_func = @_Object.handler_B
Case Else
handler_func = @_Object.handler_default
End Select
End Constructor
Sub _Object.handler()
handler_func(This)
End Sub
Sub _Object.handler_default( ByRef obj As _Object )
Print "デフォルトメソッドを使った取り扱い"
End Sub
Sub _Object.handler_A( ByRef obj As _Object )
Print "メソッドAを使った取り扱い"
End Sub
Sub _Object.handler_B( ByRef obj As _Object )
Print "メソッドBを使った取り扱い"
End Sub
Dim objects(1 To 4) As _Object => _
{ _
_Object.handlertype.ht_B, _
_Object.handlertype.ht_default, _
_Object.handlertype.ht_A _
}
'' 配列の第4項目は、 _Object.handlertype.ht_default です
For i As Integer = 1 To 4
Print i,
objects(i).handler()
Next i
'' 型のすべてのインスタンスに、ユニークなIDを割り当てます(生成の順に増分された ID)。
Type UDT
Public:
Declare Property getID () As Integer
Declare Constructor ()
Private:
Dim As Integer ID
Static As Integer countID
End Type
Dim As Integer UDT.countID = 0
Property UDT.getID () As Integer
Property = This.ID
End Property
Constructor UDT ()
This.ID = UDT.countID
UDT.countID += 1
End Constructor
Dim As UDT uFirst
Dim As UDT uSecond
Dim As UDT uThird
Print uFirst.getID
Print uSecond.getID
Print uThird.getID
QBからの違い:
参照: