Visual Basic の共有メンバ
更新 : 2007 年 11 月
共有メンバは、1 つのクラスまたは構造体のすべてのインスタンスで共有されるプロパティ、プロシージャ、およびフィールドです。プログラミング言語によっては、静的メンバとも呼ばれます。
共有フィールドと共有プロパティ
インスタンスのいずれかに固有ではなく、クラスの一部となっている情報がある場合は、共有されたフィールドやプロパティが有効です。共有フィールドおよび共有プロパティの値を変更すると、クラスとそのクラスのすべてのインスタンスに関連付けられた値も変更されます。
一方、インスタンスのいずれかに関連付けられた非共有フィールドやプロパティの値を変更しても、同じクラスの他のインスタンスのフィールドやプロパティが影響を受けることはありません。非共有フィールドやプロパティは、クラスのインスタンスごとに独立して存在します。
このように、共有フィールドや共有プロパティは、クラスのインスタンスからだけ、またはクラス名で修飾することによってアクセスできる、グローバル変数のように動作します。共有フィールドや共有プロパティを使用せずに同じ機能を使用するには、モジュール レベルの変数を使用する必要があります。ただし、モジュール レベルの変数は、クラスの理解や保守を難しくする場合があります。また、モジュール レベルの変数をこのように使用すると、クラスが表現するカプセル化の概念に反することになります。
共有プロシージャ
共有プロシージャは、クラスの特定のインスタンスに関連付けられていないクラス メソッドです。たとえば、Math クラスで定義されている Cos メソッドは共有メソッドです。共有プロシージャは、オブジェクトのメソッドとして呼び出すか、クラスから直接呼び出すことができます。
共有プロシージャと共有プロパティは、そのクラスのインスタンスにはアクセスできません。このため、共有メソッドでは、非共有データ メンバには修飾参照だけが許可されています。
メモ : |
---|
クラスのインスタンス経由で共有メンバにアクセスするコードを作成するのはお勧めできません。これは、コンパイラが共有メンバの修飾を無視し、クラス経由で直接アクセスされているものとして扱うためです。一部のコードを実行するためにオブジェクトを修飾する場合も考えられるため、Visual Basic コンパイラは、クラスのインスタンス経由で共有メンバにアクセスしようとすると警告を表示します。IntelliSense では、クラスのインスタンスに対して共有メンバを表示しません。 |
共有メンバの例
次の例では、共有フィールド、2 つのインスタンス フィールド、および共有メソッドを作成して、コード中における共有メンバの動作を示します。
Public Class Item
Public Shared Count As Integer = 1
Public Shared Sub ShareMethod()
MsgBox("Current value of Count: " & Count)
End Sub
Public Sub New(ByVal Name As String)
' Use Count to initialize SerialNumber.
Me.SerialNumber = Count
Me.Name = Name
' Increment the shared variable
Count += 1
End Sub
Public SerialNumber As Integer
Public Name As String
Public Sub InstanceMethod()
MsgBox("Information in the first object: " & _
Me.SerialNumber & vbTab & Me.Name)
End Sub
End Class
Sub TestShared()
' Create two instances of the class.
Dim part1 As New Item("keyboard")
Dim part2 As New Item("monitor")
part1.InstanceMethod()
part2.InstanceMethod()
Item.ShareMethod()
End Sub
TestShared プロシージャを実行すると、クラスのインスタンスが 2 つ作成されます。コンストラクタは、共有フィールド Count を使用して、インスタンス フィールド SerialNumber を初期化し、Count をインクリメントします。このテクニックにより、各インスタンスに自動的に異なるシリアル番号が割り当てられます。
2 つのインスタンスを作成した後で、インスタンス メソッド InstanceMethod が両方のオブジェクトで呼び出され、共有メソッド ShareMethod も呼び出されます。出力は次のとおりです。
Information in the first object: 1 keyboard
Information in the second object: 2 monitor
Current value of the shared Count field: 3