プロパティ

 VBでは、クラスの中にプロパティを定義することができます。このプロパティは、クラス作成者の側から見ると、メソッドのように記述をします。クラス利用者の側から見ると、フィールドのように利用できます。

プロパティのイメージ
プロパティのイメージ

プロパティ定義の書式
アクセス修飾子 Property プロパティ名 As データ型
 Get
  フィールド取得の記述
 End Get
 Set(value As データ型)
  フィールド設定の記述
 End Set
End Property

 アクセス修飾子ではPublicやPrivateのほかに、「ReadOnly」「WriteOnly」を指定することにより、代入するか、参照するかの制限を指定することができます。

 次のプログラムは「ReadOnly」を指定したプログラムです。Getプロシージャのみ表示されます。

Public ReadOnly Property Speed As Integer
 Get

 End Get
End Property

 次のプログラムは「WriteOnly」を指定したプログラムです。Setプロシージャのみ表示されます。

 
Public WriteOnly Property Speed As Integer
 Set(value As Integer)

 End Set
End Property

 また、プロパティを省略して書くこともできます。

例:

Public Property Speed As Integer
 Get
  Return Me._speed
 End Get
 Set(value As Integer)          ⇒          Public Property Speed() As Integer
  Me._speed = value
 End Set
End Property

○ プロジェクト

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

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

サンプルダウンロード

○ 作成の準備

 Carクラスにプロパティを追加しましょう。「ConstractorTest」をコピーしてプロジェクトを作成してください。

○ プログラム

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

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.  'プロパティ==========
  8.  'スピード参照用
  9.  Public ReadOnly Property Speed As Integer
  10.   Get
  11.    Return Me._speed
  12.   End Get
  13.  End Property
  14.  'ガソリン参照・設定用
  15.  Public Property Gas As Double
  16.   Get
  17.    Return Me._gas
  18.   End Get
  19.   Set(value As Double)
  20.    '止まっている場合は指定したガソリン量を給油
  21.    If Me._speed = 0 Then
  22.     Me._gas += value
  23.    End If
  24.   End Set
  25.  End Property
  26.  'コンストラクタ===========
  27.  Public Sub New()
  28.   Me.New(20)
  29.  End Sub
(そのほかの記述…)
  1.  '初期化を行うメソッド
  2.  'Public Sub Init(gas As Double)
  3.  ' Me._speed = 0
  4.  ' Me._gas = gas
  5.  'End Sub
  6.  ''スピードを取得する
  7.  'Public Function GetSpeed() As Integer
  8.  ' Return Me._speed
  9.  'End Function
  10.  ''ガソリン量を取得する
  11.  'Public Function GetGas() As Double
  12.  ' Return Me._gas
  13.  'End Function
  14.  ''ガソリンを給油するメソッド
  15.  'Public Sub SetGas()
  16.  ' 'オーバーロードしているメソッドを呼び出す
  17.  ' Me.SetGas(20)
  18.  'End Sub
  19.  'Public Sub SetGas(gas As Double)
  20.  ' '止まっている場合は指定したガソリン量を給油
  21.  ' If Me._speed = 0 Then
  22.  ' Me._gas += gas
  23.  ' End If
  24.  'End Sub
  25. End Class

○ クラス図

○ 解説

 11~15行目では、スピード参照用のプロパティを定義しています。利用するプログラム側で「オブジェクト変数名.Speed」と記述することにより、Getプロシージャで記述されている処理を実行します。今回は、_speedフィールド変数の内容を返します。

 18~28行目では、ガソリン量の参照・設定用のプロパティを定義しています。利用するプログラム側で「オブジェクト変数名.Gas」と記述することにより、Getプロシージャで記述されている処理を実行します。今回は、_gasフィールド変数の内容を返します。また利用するプログラム側で「オブジェクト変数名.Gas = 30.5」と記述することにより、Setプロシージャで記述されている処理を実行します。代入されたデータはvalueキーワードで扱えるので、車が止まっている場合は_gasフィールド変数に設定するガソリン量を加算します。

 スピード参照、ガソリン量参照・設定のプロパティを用意したので、同じような処理をするメソッドはコメントアウトして廃止しました。

○ プログラム

 プロパティが用意されたので、Carクラスを利用する記述も変更しましょう。

Module1.vb

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

○ 解説

 6、9、43行目は、メソッドの廃止により使えなくなったのでコメントアウトしました。その代わりに用意されたプロパティを利用するために、7、10行目はプロパティの参照の記述をしています。また、44行目でもメソッドによってガソリン量を設定していましたが、プロパティの代入によってガソリン量を設定する記述を追加しました。

 このようにプロパティを追加することにより、Carオブジェクトにとってはメソッドのように動作し、Carクラスを利用するオブジェクトからはフィールドを使うかのように利用することができるようになりました。

 また、プロパティを定義することでフィールドの定義を省略することができます。

○ プロジェクト

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

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

サンプルダウンロード

○ プログラム

 Fruitクラスを追加して次のように定義してください。

Fruit.vb

  1. Public Class Fruit
  2.  'プロパティ
  3.  Public Property Name As String
  4.  Public Property Price As Integer
  5.  'コンストラクタ
  6.  Public Sub New(name As String)
  7.   Me.New(name, 0)
  8.  End Sub
  9.  Public Sub New(name As String, price As Integer)
  10.   Me.Name = name
  11.   Me.Price = price
  12.  End Sub
  13.  'メソッド
  14.  '個数を受け取って合計金額を計算するメソッド
  15.  Public Function CalculatePrice(quantity As Integer) As Integer
  16.   Return Me.Price * quantity
  17.  End Function
  18. End Class

○ クラス図

○ 解説

 今回のサンプルでのFruitクラスは、名前と価格の情報を持ち、個数を指定すると価格を元に合計金額を計算するメソッドを定義しています。

 3、4行目ではプロパティを定義しています。フィールドは定義していません。このようにプロパティのみ定義することでそれに対応するフィールドは自動的に用意されます。フィールドに対する参照や設定が単純なものは今回のように自動実装のプロパティで用意することができます。

○ プログラム

 Fruitクラスを利用するプログラムを記述してください。

Module1.vb

  1. Module Module1
  2.  Sub Main()
  3.   'フルーツオブジェクト生成
  4.   Dim fruitobj As New Fruit("りんご", 150)
  5.   'りんごの合計金額を取得
  6.   Dim totalprice As Integer = fruitobj.CalculatePrice(5)
  7.   'りんごの合計金額を表示
  8.   Console.WriteLine("商品名:{0}", fruitobj.Name)
  9.   Console.WriteLine("合計金額:{0}円", totalprice)
  10.   Console.ReadLine()
  11.  End Sub
  12. End Module

○ 解説

 Fruitオブジェクトを生成して利用しています。11行目でプロパティを参照しています。5行目のコンストラクタで商品名を指定した内容が取得されます。

○ 実行結果

商品名:りんご
合計金額:750円

前へ   次へ