VB.NETをつつく13ーコンストラクタ。うっかりミスを防ごう。
チッチッチチッチッチチッチッチチッチッチチッチッチチッチッチ
継承?残念、まだやることがあるよ。 前回の最後のサンプルプログラムの一部を見てみよう。
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
どう?何か気付かない?もっとおかしな点を狭めてみてみよう。Dim b As Bird = New Bird() b.Name = "インドリ" b.Age = 29 b.Name = "ドリィちゃん" b.Age = -20一々名前と年齢を指定するなんて凄く面倒だよね。
だから・・・
Dim b As Bird = New Bird( "インドリ", 29 )って変数を作る際に指定できれば便利だし、 名前と年齢の値の指定忘れを防げるよね。 勿論、プログラム言語を作った偉い人はその方法を用意しているよ。
それがコンストラクタなんだ。
では、さっそくコンストラクタを作ってみよう。
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)
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
Birdクラスのコードをこう変えてコンパイルしてみよう。すると・・・'Public Sub New(name As String, age As Integer)' のパラメータ 'age' に対して引数が指定されていません。
'Public Sub New(name As String, age As Integer)' のパラメータ 'name' に対して引数が指定されていません。
とエラーが出るよね。これでいいんだ。 こうすることにより名前と年齢を指定し忘れる事がなくなるピヨ。 鳥頭のボクには最適な機能だね。こうすると使用するプログラムは次の様になるよ。
Public Class Module1
Public Shared Sub Main()
Dim b As Bird = New Bird("インドリ", 29)
b.Talk()
b.Name = "ドリィちゃん"
b.Age = -20
b.Talk()
Console.WriteLine("ドリィちゃん、ボクと同じ年齢なんだね♪")
End Sub
End Class
コンストラクタの部分はこれでお終い。でもひとつ注意があるピヨ。それは・・・コンストラクタは必要最低限定義しよう ということピヨ。コンストラクタを覚えたての頃は嬉しくて「よーし全部のプロパティを指定できるコンストラクタを作るぞ!」 と思ってしまうかもしれない。だけど、コンストラクタはあくまでも 絶対必要なものだけを指定するものなんだ。 注意してね。
C#の記事はここで終わっているけどVB.NETには気になる点があるピヨ。 それは、コンストラクタが必ずNewになっている事だピヨ。 Newは3文字だからコード量が減るからいいんだけど、「じゃあクラス名と同じメソッドを定義できるの?」と 悪戯心が湧き上がって来る。ウォー。よしやってみよう!。えいっや!。
Public Sub Bird(ByVal name As String, ByVal age As Integer)
Me.Name = name
Me.Age = age
End Sub
このコードを追加してコ♪ン♪パ♪イ♪ル。やったぁ、やったぞ。成功だー。
インドリィちゃん「それが何か?」
うっっっC#を使っている人がリフレクションを使った時混乱するから開発現場で クラス名と同じメソッドは定義しちゃ駄目ピヨ。
じゃあ今度こそ終わり。