VB.NETをつつく16-抽象型。時には曖昧に。
実は前回のプログラムには凄くおかしなところがあります。
さて、それはどの点でしょうか?
チッチッチッチチッチッチッチチッチッチッチチッチッチッチチッチッチッチチッチッチッチ
時間切れピヨ。さて答えを発表するぞ。
答えは・・・Animalクラスのインスタンスを作れる事ピヨ。
動物って、凄く曖昧な表現だよね。その曖昧なもののインスタンス化を認めちゃうとおかしなプログラムが出来上がる。 この短い例だとわかりにくいかもしれないけど、動物園の管理システムを作っている事を想像してごらん。 動物に名前と年齢をつけるって事は、動物園の人達が「何の動物か分からない無いけど飼育している」状態なんだ。 おかしいよね。それじゃ未確認飛行物体ならぬ未確認生命体だよ。まぁ、実際存在したら凄く魅力的な動物園だけどね。 それじゃあ普通はプログラムのエーラーと捉えるよね? ということで、Animalクラスのインスタンス化を禁止するコードを実装するピヨ。 とぉー
'宣言に注目
Public MustInherit Class Animal
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)
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.Name = name
Me.Age = age
End Sub
Public Sub Talk()
Console.WriteLine("ワタシハ{0}。年は{1}だよ。", _
Me.Name, Me.Age)
End Sub
End Class
みんな、前回のAnimalクラスの定義と何処が違うか分かったかな?Public MustInherit Class Animalの所のMustInheritキーワードが増えているピヨ。 このキーワードをつけることによりインスタンス化を禁止できるんだ。 これは余談だけど、MustInheritキーワードは複数言語使いには厳しいピヨ。 「継承しなければならない」という意味だと思うんだけど、 もういっそうのことAbstractにしてくれたらいいのにね。
余談はこれぐらいにして早速試そう。
'MustInherit' で宣言されたクラスでは、'New' を使用することはできません。
ってVB.NETコンパイラに怒られるよね。これでいいんだ。
このインスタンス化できないクラスの事を抽象クラス と呼ぶピヨ。
勘のいい人は気付いているとおもうけど、もちろん抽象化クラスはその他の利点も持っているピヨ。
それは、ヒ・ミ・ツ。というのは冗談で、多態性の時あわせて説明するピヨ。楽しみに待っててね。