Sharedメンバ、Sharedクラス

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

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

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

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

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

○ プロジェクト

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

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

サンプルダウンロード

○ 作成の準備

 CarクラスにSharedメンバを追加しましょう。「PropertyTest」をコピーしてプロジェクトを作成してください。

○ プログラム

 次のように記述を追加・修正してください。

Car.vb

  1. Public Class Car
  2.  'フィールド==========
  3.  'Public _speed As Integer 'スピード情報
  4.  Private _speed As Integer     'スピード情報(修正)
  5.  'Public _gas As Double 'ガソリン情報
  6.  Private _gas As Double     'ガソリン情報(修正)
  7.  Private Shared Maker As String = "ダッシュ"     'メーカー名
(そのほかの記述…)
  1.  ''ガソリンを給油するメソッド
  2.  'Public Sub SetGas()
  3.  ' 'オーバーロードしているメソッドを呼び出す
  4.  ' Me.SetGas(20)
  5.  'End Sub
  6.  'Public Sub SetGas(gas As Double)
  7.  ' '止まっている場合は指定したガソリン量を給油
  8.  ' If Me._speed = 0 Then
  9.  ' Me._gas += gas
  10.  ' End If
  11.  'End Sub
  12.  'メーカーを紹介するメソッド
  13.  Public Shared Function IntroductionMaker() As String
  14.   Return "この車は" & Maker & "製です。"
  15.  End Function
  16. End Class

○ クラス図

○ 解説

 8行目では、メーカー名を扱うフィールドを宣言しています。このフィールドはSharedキーワードがついているので、インスタンスを生成しなくても使えます。今回はPrivateとなっているので、内部からしか使えませんが、このクラスのオブジェクトが複数生成されたとしてもひとつしか用意されません。

 95~97行目では、Sharedメソッドを定義しています。Sharedメソッド内でフィールドやメソッドを参照する場合は、Sharedなメンバを指定できます。インスタンスメンバ(インスタンスを生成しないと使用できないメンバ)は利用できません。

○ プログラム

 Sharedメンバを利用する記述を追加しましょう。

Module1.vb

  1. Sub Main()
  2.  'インスタンスを生成する
  3.  Dim obj As New Car(40)
  4.  'フィールド変数を初期化する
  5.  'obj._speed = 0
  6.  'obj._gas = 20.0
  7.  'obj.Init(20)
  8.  '現在の状態を表示する
  9.  ShowData(obj)
  10.  While True
  11.   '操作を入力
  12.   Console.Write("1)加速 2)減速 3)給油 4)メーカー紹介 9)終了:")
  13.   Dim inputdata As String = Console.ReadLine()
  14.   '操作によって分岐する
  15.   Select Case inputdata
  16.    Case "1"
  17.     '加速する
  18.     obj.SpeedUp(5)
  19.     obj.Gas = 100
  20.     ShowData(obj)
  21.    Case "2"
  22.     '減速する
  23.     obj.SpeedDown(5)
  24.     ShowData(obj)
  25.    Case "3"
  26.     '給油する
  27.     'obj.SetGas(35)
  28.     obj.Gas = 35
  29.     ShowData(obj)
  30.    Case "4"
  31.     'メーカーを表示する
  32.     Console.WriteLine(Car.IntroductionMaker())
  33.    Case "9"
  34.     'プログラムを終了する
  35.     Return
  36.    End Select
  37.   End While
  38. End Sub

○ 解説

 メーカー紹介のメニューを追加しました。48行目でメニュー紹介のIntroductionMakerメソッドの呼び出しをしています。このメソッドはSharedメソッドなので、「クラス名.IntroductionMaker()」となっていることに注目してください。

インスタンスメンバとSharedメンバの例
インスタンスメンバとSharedメンバの例

前へ   次へ