共有メンバ
通常のメンバは、インスタンスごとに個々の値を持ちます。Carクラスを基にインスタンスを3回生成すると、車のオブジェクトが3台分できます。それぞれ、スピードを記憶できたり、ガソリンを積んだりしていますが、3台とも別々で動いているわけです。
しかし、クラスのメンバの中で「Shared」を指定すると、静的メンバとなります。つまり、複数のオブジェクトから1つのデータを共有して利用することができるようになります。また、Sharedメンバはインスタンスを生成しなくても利用することができます。
○ プロジェクト
プロジェクトを作成して確認してみましょう。
| プロジェクトの種類 |
コンソール アプリケーション |
| プロジェクト名 |
SharedTest1 |
サンプルダウンロード
○ 作成の準備
Carクラスのメンバに共有フィールド変数を定義して、利用しましょう。「PropertyTest」をコピーしてプロジェクトを作成してください。
○ プログラム
次のようにCarクラスにプログラムを追加してください。
Car.vb
- Public Class Car
- 'フィールド==========
- 'Public m_speed As Integer 'スピード情報
- Private m_speed As Integer 'スピード情報(修正)
- 'Public m_gas As Double 'ガソリン情報
- Private m_gas As Double 'ガソリン情報(修正)
- Private Shared Maker As String = "ダッシュ" 'メーカー名
(そのほかの記述…)
- End Class
○ フォームデザイン
複数の車を使用しますので、以下のようにフォームにコントロールを配置してください。「InstanceWTest」のコントロールに追加した仕様です。
各コントロールの配置とプロパティの設定内容
○ プログラム
次のように利用するプログラムを記述してください。
Form1.vb
- Public Class Form1
- 'インスタンス変数
- Dim car1 As Car
- Dim car2 As Car
- 'car1表示用
- Private Sub showCar1()
- Me.TextBox1.Text = Me.car1.Speed
- Me.TextBox2.Text = Me.car1.Gas
- End Sub
- 'car2表示用
- Private Sub showCar2()
- Me.TextBox3.Text = Me.car2.Speed
- Me.TextBox4.Text = Me.car2.Gas
- End Sub
- Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- 'インスタンス生成
- Me.car1 = New Car(30) '1台目
- Me.car2 = New Car(60) '2台目
- Me.TextBox5.Text = car1.Maker
- Me.TextBox6.Text = Car.Maker
- End Sub
- 'car1の[加速]ボタンクリック
- Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
- '加速する
- Me.car1.SpeedUp(5)
- Me.showCar1()
- End Sub
- 'car1の[減速]ボタンクリック
- Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
- '減速する
- Me.car1.SpeedDown(5)
- Me.showCar1()
- End Sub
- 'car2の[加速]ボタンクリック
- Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
- '加速する
- Me.car2.SpeedUp(5)
- Me.showCar2()
- End Sub
- 'car2の[減速]ボタンクリック
- Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
- '減速する
- Me.car2.SpeedDown(5)
- Me.showCar2()
- End Sub
- End Class
共有メンバは、「クラス名.共有メンバ名」で利用することができます。
共有ですので、変更すると参照する全てのオブジェクトに影響を及ぼします。次のようにボタンを追加して、プログラムも追加してみてください。
○ プロジェクト
プロジェクトを作成して確認してみましょう。
| プロジェクトの種類 |
コンソール アプリケーション |
| プロジェクト名 |
SharedTest2 |
サンプルダウンロード
○ 作成の準備
「SharedTest1」をコピーしてプロジェクトを作成してください。
○ フォームデザイン
以下のようにフォームにコントロールを追加してください。
各コントロールの配置とプロパティの設定内容
○ プログラム
次のように利用するプログラムを記述してください。
Form1.vb
- Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
- Me.car1.Maker = Me.TextBox7.Text
- Me.TextBox5.Text = Me.car1.Maker
- Me.TextBox6.Text = Me.car2.Maker
- End Sub
今回のプログラムは、クラスの定義で既にメーカー名が設定されていますが、ボタンをクリックしてすぐに変更をし、その後、各オブジェクトで参照してみました。すると、変更が反映されているのが分かります。
プログラム内で、「Me.car1.Maker」や「Me.car2.Maker」としていますが警告が表示されます。それぞれのオブジェクトを通して共有メンバを参照しても同じものが参照できることを確認するために指定しています。正しい指定は「Car.Maker」とします。
共有メンバのイメージ
共有メンバは使用されるとメモリ上に1つだけ存在し続けます。そのため、インスタンスを生成しなくても同じフィールドやメソッドを利用することができます。メソッドも共有にすることができますが、共有メソッドからインスタンス変数(上図の例では、「m_speed」や「m_gas」)を利用することができません。
前へ 次へ