こんピヨー(こんにちは)。
今回はVB.NETで
カプセル化を実現する
為の機能である
プロパティの実装をつついてみよう。
プロパティのありがたみを知るには、やっぱりプロパティ無い状態を見るのが一番。
さっそくプロパティが無い時を見てみよう。
Imports System
Public Class Bird
Public Name As String
Public Age As Integer
Public Sub Talk()
Console.WriteLine("ワタシハ{0}。年は{1}だよ。", _
Me.Name, Me.Age)
End Sub
End Class
Imports System
Public Class Bird
Public Name As String
Public Age As Integer
Public Sub Talk()
Console.WriteLine("ワタシハ{0}。年は{1}だよ。", _
Me.Name, Me.Age)
End Sub
End Class
Public Class Module1
Sub Main()
Dim b As Bird = New Bird()
b.Name = "インドリ"
b.Age = 29
b.Talk()
b.Name = "ドリィちゃん"
b.Age = -20
b.Talk()
Console.WriteLine("えぇ〜!、凄い年齢詐称だ・・・")
End Sub
End Class
ドリィちゃんそこまで年齢を誤魔化さなくても・・・
インドリィちゃん「女性の年齢を聞くな!」
こんな具合にフィールドを直接扱えるようにしてしまったら
入力値の妥当性をチェックできない
んだ。では入力値をチェックするために値の設定にメソッドを設定してみよう、
Public Class Bird
Public Name As String
'これで直接操作できない
Private Age As Integer
Public Sub Talk()
Console.WriteLine("ワタシハ{0}。年は{1}だよ。", _
Me.Name, Me.Age)
End Sub
Public Sub SetAge(ByVal value As Integer)
Me.Age = value
End Sub
End Class
Public Class Module1
Public Shared Sub Main()
Dim b As Bird = New Bird()
b.Name = "インドリ"
b.SetAge(29)
b.Talk()
b.Name = "ドリィちゃん"
b.SetAge(-20)
b.Talk()
Console.WriteLine("ドリィちゃん、ボクと同じ年齢なんだね♪")
End Sub
End Class
これで年齢にマイナス値を入力したら、その罰として前の人の年齢が表示されるようになるよ。
インドリィちゃん「この屈辱忘れるものかぁぁ」
ビック!ちょっと後がまずいことになるかも・・・それはさておき、フィールドを保護するために一々Set○○、Get○○って
名前のメソッドを作るのは面倒だし見栄えが悪いよね。だからVB.NETにはもっといい方法が用意されているんだ。早速見てみよう。
Imports System
Public Class Bird
Private m_name As String
Public Property Name() As String
Get
Return m_name
End Get
Set(ByVal value As String)
Me.m_name = value
End Set
End Property
Private m_age As Integer
Public Property Age() As Integer
Get
Return Me.m_age
End Get
Set(ByVal value As Integer)
Me.m_age = value
End Set
End Property
Public Sub Talk()
Console.WriteLine("ワタシハ{0}。年は{1}だよ。", _
Me.Name, Me.Age)
End Sub
End Class
Public Class Module1
Public Shared Sub Main()
Dim b As Bird = New Bird()
b.Name = "インドリ"
b.Age = 29
b.Talk()
b.Name = "ドリィちゃん"
b.Age = -20
b.Talk()
Console.WriteLine("ドリィちゃん、ボクと同じ年齢なんだね♪")
End Sub
End Class
この構文が
プロパティなんだ。この構文を詳しく突付いてみよう。
まずは始めのプロパティの宣言は・・・
Public Property Age() As Integer プログラム End Property
プロパティが見える範囲、
ってなっている。これは
プロパティの型、
プロパティの名前の三つを指定しているんだ。
プロパティが見える範囲については色々あるから説明は後回しで、型と名前を考えてみよう。
型と名前はもうお馴染だよね?考え方はフィールド(変数)と変わらないピヨ。
プロパティとフィールドの違いは、
Get プログラム End Get
と
Set プログラム End Set
があるところなんだ。
Getはプロパティの値を取得する部分で、Setはプロパティの値を設定する部分なんだ。
Setの部分だけ注意が必要で
valueという特別な変数があるんだ。
これは
今代入しようとしている値なんだ。
Propertyとかvalueが明示されているから初心者の方にとってはC#よりもわかりやすいかもね。
これは余談なんだけど実はプロパティは全てのオブジェクト指向言語に実装されているわけではないんだ。
それは何故かというと、メソッドでも実現できるから「メソッドで同じことが出来るからいいじゃん」という人がいるからなんだ。
だけどボク個人の意見としてはリフレクションを有効に使うためにはプロパティとメソッドを明確に分けたほうが良いと思うピヨ。
余談おしまい。この記事もおしまい。