共有メンバ

 通常のメンバは、インスタンスごとに個々の値を持ちます。Carクラスを基にインスタンスを3回生成すると、車のオブジェクトが3台分できます。それぞれ、スピードを記憶できたり、ガソリンを積んだりしていますが、3台とも別々で動いているわけです。

 しかし、クラスのメンバの中で「Shared」を指定すると、静的メンバとなります。つまり、複数のオブジェクトから1つのデータを共有して利用することができるようになります。また、Sharedメンバはインスタンスを生成しなくても利用することができます。

静的フィールド変数定義の書式
アクセス修飾子 Shared 変数名 As データ型

静的メソッド定義の書式
アクセス修飾子 Shared Sub メソッド名(引数リスト)
 処理
End Sub

アクセス修飾子 Shared Function メソッド名(引数リスト) As 戻り値の型
 処理
 Return 戻り値
End Function

○ プロジェクト

 プロジェクトを作成して確認してみましょう。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 SharedTest1

サンプルダウンロード

○ 作成の準備

 Carクラスのメンバに共有フィールド変数を定義して、利用しましょう。「PropertyTest」をコピーしてプロジェクトを作成してください。

○ プログラム

 次のようにCarクラスにプログラムを追加してください。

Car.vb

  1. Public Class Car
  2.  'フィールド==========
  3.  'Public m_speed As Integer 'スピード情報
  4.  Private m_speed As Integer     'スピード情報(修正)
  5.  'Public m_gas As Double 'ガソリン情報
  6.  Private m_gas As Double     'ガソリン情報(修正)
  7.  Private Shared Maker As String = "ダッシュ"     'メーカー名
(そのほかの記述…)
  1. End Class

○ フォームデザイン

 複数の車を使用しますので、以下のようにフォームにコントロールを配置してください。「InstanceWTest」のコントロールに追加した仕様です。

各コントロールの配置とプロパティの設定内容
各コントロールの配置とプロパティの設定内容

○ プログラム

 次のように利用するプログラムを記述してください。

Form1.vb

  1. Public Class Form1
  2.  'インスタンス変数
  3.  Dim car1 As Car
  4.  Dim car2 As Car
  5.  'car1表示用
  6.  Private Sub showCar1()
  7.   Me.TextBox1.Text = Me.car1.Speed
  8.   Me.TextBox2.Text = Me.car1.Gas
  9.  End Sub
  10.  'car2表示用
  11.  Private Sub showCar2()
  12.   Me.TextBox3.Text = Me.car2.Speed
  13.   Me.TextBox4.Text = Me.car2.Gas
  14.  End Sub
  15.  Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  16.   'インスタンス生成
  17.   Me.car1 = New Car(30) '1台目
  18.   Me.car2 = New Car(60) '2台目
  19.   Me.TextBox5.Text = car1.Maker
  20.   Me.TextBox6.Text = Car.Maker
  21.  End Sub
  22.  'car1の[加速]ボタンクリック
  23.  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
  24.   '加速する
  25.   Me.car1.SpeedUp(5)
  26.   Me.showCar1()
  27.  End Sub
  28.  'car1の[減速]ボタンクリック
  29.  Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
  30.   '減速する
  31.   Me.car1.SpeedDown(5)
  32.   Me.showCar1()
  33.  End Sub
  34.  'car2の[加速]ボタンクリック
  35.   Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
  36.   '加速する
  37.   Me.car2.SpeedUp(5)
  38.   Me.showCar2()
  39.  End Sub
  40.  'car2の[減速]ボタンクリック
  41.  Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
  42.   '減速する
  43.   Me.car2.SpeedDown(5)
  44.   Me.showCar2()
  45.  End Sub
  46. End Class

 共有メンバは、「クラス名.共有メンバ名」で利用することができます。

 共有ですので、変更すると参照する全てのオブジェクトに影響を及ぼします。次のようにボタンを追加して、プログラムも追加してみてください。

○ プロジェクト

 プロジェクトを作成して確認してみましょう。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 SharedTest2

サンプルダウンロード

○ 作成の準備

 「SharedTest1」をコピーしてプロジェクトを作成してください。

○ フォームデザイン

 以下のようにフォームにコントロールを追加してください。

各コントロールの配置とプロパティの設定内容
各コントロールの配置とプロパティの設定内容

○ プログラム

 次のように利用するプログラムを記述してください。

Form1.vb

  1. Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
  2.  Me.car1.Maker = Me.TextBox7.Text
  3.  Me.TextBox5.Text = Me.car1.Maker
  4.  Me.TextBox6.Text = Me.car2.Maker
  5. End Sub

 今回のプログラムは、クラスの定義で既にメーカー名が設定されていますが、ボタンをクリックしてすぐに変更をし、その後、各オブジェクトで参照してみました。すると、変更が反映されているのが分かります。

 プログラム内で、「Me.car1.Maker」や「Me.car2.Maker」としていますが警告が表示されます。それぞれのオブジェクトを通して共有メンバを参照しても同じものが参照できることを確認するために指定しています。正しい指定は「Car.Maker」とします。

共有メンバのイメージ
共有メンバのイメージ

 共有メンバは使用されるとメモリ上に1つだけ存在し続けます。そのため、インスタンスを生成しなくても同じフィールドやメソッドを利用することができます。メソッドも共有にすることができますが、共有メソッドからインスタンス変数(上図の例では、「m_speed」や「m_gas」)を利用することができません。

前へ   次へ