早速だけど、前回までに作ったクラスは致命的なミスがあるんだ。そのミスを示すコードを見てピヨね。
Public Class Module1
Public Shared Sub Main()
Dim tori As Bird = New Bird("インドリ", 29)
tori.Move()
Console.WriteLine("{0}参上!", tori.Name)
tori.Talk()
Console.WriteLine()
Dim dre As Human = New Human("ドリィちゃん", 16)
dre.Move()
Console.WriteLine("{0}参上!", dre.Name)
dre.Talk()
Console.WriteLine()
'名前も年齢も簡単に変えられる!
Console.WriteLine("へーしん。")
tori.Name = "怪盗20面相"
tori.Age = 2000
tori.Move()
tori.Talk()
Console.WriteLine()
End Sub
End Class
これおかしいよね。だって、NameプロパティとAgeプロパティが何の制限もなく自由に変更できたら、
瞬間的に人や鳥が別人(別鳥)になってしまうから論理的におかしくなってしまうピヨ。
これじゃあ、まともな動物園のソフトはつれないよね。
これを防ぐには
プロパティを読み取り専用にすればいいピヨ。
やり方は簡単早速変更してみよう。
Public MustInherit Class Animal
Private m_name As String
'読み取りしか出来ない
Public ReadOnly Property Name() As String
Get
Return m_name
End Get
End Property
Private m_age As Integer
Public Property Age() As Integer
Get
Return Me.m_age
End Get
Set(ByVal value As Integer)
If value > 0 Then
Me.m_age = value
End If
End Set
End Property
Public Sub New(ByVal name As String, ByVal age As Integer)
Me.m_name = name
Me.Age = age
End Sub
Public Overridable Sub Talk()
Console.WriteLine("ワタシハ{0}。年は{1}だよ。", _
Me.Name, Me.Age)
End Sub
Public MustOverride Sub Move()
End Class
Ageプロパティは年齢が変わる事があるからひとまずおいておくことにして、Nameプロパティを読み取り専用にしたピヨ。
まずは宣言に
ReadOnlyキーワードを付け加えて、
Set
プログラム
End Set
を消すだけで良いんだ簡単だね。
VBは一目で読み取り専用って分かるから良いよね。
でもこれじゃあ簡単すぎて、記事的に面白くないから一つ豆知識を披露するピヨ。
この消したSetは
Setter(セッター)と呼び、Getは
Getter(ゲッター)と呼ぶんだ。覚えておいて損は無いピヨ。
これでこの記事はお終い。次は何をつっつこうかな♪