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

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

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#を使っている人がリフレクションを使った時混乱するから開発現場で クラス名と同じメソッドは定義しちゃ駄目ピヨ。
じゃあ今度こそ終わり。
別窓 | VB.NET | コメント:0 | トラックバック:0 | ∧top | under∨
<<VB.NETをつつく14−インスタンス。人はみな違う。ひとつだけの花。 | 無差別に技術をついばむ鳥 | C#をつつく14−インスタンス。人はみな違う。ひとつだけの花。>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

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

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