トップ > VB2017オブジェクト指向編(目次) > プロパティ
プロパティ
VBでは、クラスの中にプロパティを定義することができます。このプロパティは、クラス作成者の側から見ると、メソッドのように記述をします。クラス利用者の側から見ると、フィールドのように利用できます。
プロパティのイメージ
アクセス修飾子では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
Public Class Car
'フィールド==========
'Public _speed As Integer 'スピード情報
Private _speed As Integer 'スピード情報(修正)
'Public _gas As Double 'ガソリン情報
Private _gas As Double 'ガソリン情報(修正)
'プロパティ==========
'スピード参照用
Public ReadOnly Property Speed As Integer
Get
Return Me._speed
End Get
End Property
'ガソリン参照・設定用
Public Property Gas As Double
Get
Return Me._gas
End Get
Set(value As Double)
'止まっている場合は指定したガソリン量を給油
If Me._speed = 0 Then
Me._gas += value
End If
End Set
End Property
'コンストラクタ===========
Public Sub New()
Me.New(20)
End Sub
(そのほかの記述…)
'初期化を行うメソッド
'Public Sub Init(gas As Double)
' Me._speed = 0
' Me._gas = gas
'End Sub
''スピードを取得する
'Public Function GetSpeed() As Integer
' Return Me._speed
'End Function
''ガソリン量を取得する
'Public Function GetGas() As Double
' Return Me._gas
'End Function
''ガソリンを給油するメソッド
'Public Sub SetGas()
' 'オーバーロードしているメソッドを呼び出す
' Me.SetGas(20)
'End Sub
'Public Sub SetGas(gas As Double)
' '止まっている場合は指定したガソリン量を給油
' If Me._speed = 0 Then
' Me._gas += gas
' End If
'End Sub
End Class
○ クラス図
○ 解説
11~15行目では、スピード参照用のプロパティを定義しています。利用するプログラム側で「オブジェクト変数名.Speed」と記述することにより、Getプロシージャで記述されている処理を実行します。今回は、_speedフィールド変数の内容を返します。
18~28行目では、ガソリン量の参照・設定用のプロパティを定義しています。利用するプログラム側で「オブジェクト変数名.Gas」と記述することにより、Getプロシージャで記述されている処理を実行します。今回は、_gasフィールド変数の内容を返します。また利用するプログラム側で「オブジェクト変数名.Gas = 30.5」と記述することにより、Setプロシージャで記述されている処理を実行します。代入されたデータはvalueキーワードで扱えるので、車が止まっている場合は_gasフィールド変数に設定するガソリン量を加算します。
スピード参照、ガソリン量参照・設定のプロパティを用意したので、同じような処理をするメソッドはコメントアウトして廃止しました。
○ プログラム
プロパティが用意されたので、Carクラスを利用する記述も変更しましょう。
Module1.vb
Module Module1
'車の状態を表示するメソッド
Sub ShowData(c As Car)
'Console.WriteLine("スピード:{0}km", c._speed)
'Console.WriteLine("スピード:{0}km", c.GetSpeed())
Console.WriteLine("スピード:{0}km", c.Speed)
'Console.WriteLine("ガソリン:{0}L", c._gas)
'Console.WriteLine("ガソリン:{0}L", c.GetGas())
Console.WriteLine("ガソリン:{0}L", c.Gas)
End Sub
Sub Main()
'インスタンスを生成する
Dim obj As New Car(40)
'フィールド変数を初期化する
'obj._speed = 0
'obj._gas = 20.0
'obj.Init(20)
'現在の状態を表示する
ShowData(obj)
While True
'操作を入力
Console.Write("1)加速 2)減速 3)給油 9)終了:")
Dim inputdata As String = Console.ReadLine()
'操作によって分岐する
Select Case inputdata
Case "1"
'加速する
obj.SpeedUp(5)
ShowData(obj)
Case "2"
'減速する
obj.SpeedDown(5)
ShowData(obj)
Case "3"
'給油する
'obj.SetGas(35)
obj.Gas = 35
ShowData(obj)
Case "9"
'プログラムを終了する
Return
End Select
End While
End Sub
End Module
○ 解説
6、9、43行目は、メソッドの廃止により使えなくなったのでコメントアウトしました。その代わりに用意されたプロパティを利用するために、7、10行目はプロパティの参照の記述をしています。また、44行目でもメソッドによってガソリン量を設定していましたが、プロパティの代入によってガソリン量を設定する記述を追加しました。
このようにプロパティを追加することにより、Carオブジェクトにとってはメソッドのように動作し、Carクラスを利用するオブジェクトからはフィールドを使うかのように利用することができるようになりました。
また、プロパティを定義することでフィールドの定義を省略することができます。
○ プロジェクト
プロジェクトを作成して確認してみましょう。
プロジェクトの種類
コンソール アプリケーション
プロジェクト名
PropertyTest2
サンプルダウンロード
○ プログラム
Fruitクラスを追加して次のように定義してください。
Fruit.vb
Public Class Fruit
'プロパティ
Public Property Name As String
Public Property Price As Integer
'コンストラクタ
Public Sub New(name As String)
Me.New(name, 0)
End Sub
Public Sub New(name As String, price As Integer)
Me.Name = name
Me.Price = price
End Sub
'メソッド
'個数を受け取って合計金額を計算するメソッド
Public Function CalculatePrice(quantity As Integer) As Integer
Return Me.Price * quantity
End Function
End Class
○ クラス図
○ 解説
今回のサンプルでのFruitクラスは、名前と価格の情報を持ち、個数を指定すると価格を元に合計金額を計算するメソッドを定義しています。
3、4行目ではプロパティを定義しています。フィールドは定義していません。このようにプロパティのみ定義することでそれに対応するフィールドは自動的に用意されます。フィールドに対する参照や設定が単純なものは今回のように自動実装のプロパティで用意することができます。
○ プログラム
Fruitクラスを利用するプログラムを記述してください。
Module1.vb
Module Module1
Sub Main()
'フルーツオブジェクト生成
Dim fruitobj As New Fruit("りんご", 150)
'りんごの合計金額を取得
Dim totalprice As Integer = fruitobj.CalculatePrice(5)
'りんごの合計金額を表示
Console.WriteLine("商品名:{0}", fruitobj.Name)
Console.WriteLine("合計金額:{0}円", totalprice)
Console.ReadLine()
End Sub
End Module
○ 解説
Fruitオブジェクトを生成して利用しています。11行目でプロパティを参照しています。5行目のコンストラクタで商品名を指定した内容が取得されます。
○ 実行結果
商品名:りんご
合計金額:750円
前へ 次へ