無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

VB.NETをつつく12ープロパティ。データを守ろう。

こんピヨー(こんにちは)。 今回は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#よりもわかりやすいかもね。
これは余談なんだけど実はプロパティは全てのオブジェクト指向言語に実装されているわけではないんだ。 それは何故かというと、メソッドでも実現できるから「メソッドで同じことが出来るからいいじゃん」という人がいるからなんだ。 だけどボク個人の意見としてはリフレクションを有効に使うためにはプロパティとメソッドを明確に分けたほうが良いと思うピヨ。
余談おしまい。この記事もおしまい。
別窓 | VB.NET | コメント:0 | トラックバック:0 | ∧top | under∨
<<中の人の徒然草14 | 無差別に技術をついばむ鳥 | VB.NETをつつく11−クラス。サブルーチンの進化>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |