6章:チュートリアル 5:Visual Basicのクラス構造テストの作成

    作成2013.02.27

  1. 参照元情報
     Visual Basicのクラス構造テストはVisual Basic ガイド ツアー
    「オブジェクトによるプログラミング : クラスを使用する」にジャンプする
     作成方法の詳細は上記を参照願います。


  2. チュートリアル 5:Visual Basicのクラス構造テストの完成ファイル
     オブジェクトによるプログラミング : クラスを使用するの解説とおりに作業を実施すると、プロジェクトファイル群が完成します。
     完成ファイルは以下からダウンロードできます。
     ダウンロード後は解凍してから使用してください。
      [ 5:Visual Basicのクラス構造テスト]をダウンロードする。
     解凍すると「Persons」フォルダーがあります。
    注(1)「Persons」フォルダーの「Persons.sln」ファイルをダブルクリックすると「Microsoft Visual Basic 2010 Express」が起動します。

    注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。

    注(3)「ソリューションエクスプローラ」ウインドウ内の「Form1.vb」をダブルクリックすると「デザイン」が表示されます。

    注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。

    注(5)「Persons.sln」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。


  3. Personsクラスのコード
    Public Class Persons
        Private firstNameValue As String
        Private middleNameValue As String
        Private lastNameValue As String
        Public Alive As Boolean
        Private birthYearValue As Integer
    
        Public Function FullName() As String
            If middleNameValue <> "" Then
                FullName = firstNameValue & " " & middleNameValue & " " & lastNameValue
            Else
                FullName = firstNameValue & " " & lastNameValue
            End If
        End Function
        Private Function CalcAge(ByVal year As Integer) As Integer
            CalcAge = My.Computer.Clock.LocalTime.Year - year
        End Function
        Public Property FirstName() As String
            Get
                FirstName = firstNameValue
            End Get
            Set(ByVal value As String)
                firstNameValue = value
            End Set
        End Property
    
        Public Property MiddleName() As String
            Get
                MiddleName = middleNameValue
            End Get
            Set(ByVal value As String)
                middleNameValue = value
            End Set
        End Property
    
        Public Property LastName() As String
            Get
                LastName = lastNameValue
            End Get
            Set(ByVal value As String)
                lastNameValue = value
            End Set
        End Property
    
        WriteOnly Property BirthYear() As Integer
            Set(ByVal value As Integer)
                birthYearValue = value
            End Set
        End Property
    
        ReadOnly Property Age() As String
            Get
                ' Age = My.Computer.Clock.LocalTime.Year - birthDateValue
                Age = CalcAge(birthYearValue)
            End Get
        End Property
    End Class
    


  4. Playersクラスのコード
    Public Class Players
        Inherits Persons
    
        Private numberValue As Integer
        Private positionValue As String
        Public Property Number() As Integer
            Get
                Number = numberValue
            End Get
            Set(ByVal value As Integer)
                numberValue = value
            End Set
        End Property
        Public Property Position() As String
            Get
                Position = positionValue
            End Get
            Set(ByVal value As String)
                positionValue = value
            End Set
        End Property
    End Class
    


  5. Form1クラスのコード
    Public Class Form1
        Dim person1 As New Persons.Persons
        Dim player1 As New Persons.Players
        Dim player2 As New Persons.Players
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'プロパティ値のセット
            With person1
                .FirstName = TextBox1.Text 'デバッグポイント1
                .MiddleName = TextBox2.Text
                .LastName = TextBox3.Text
                .BirthYear = TextBox4.Text
                .Alive = CheckBox1.Checked
            End With
            ' Test the FullName method.
            Dim test As String = person1.FullName 'デバッグポイント2
            MsgBox(test)
    
            ' test the Age property and CalcAge method.
            MsgBox(CStr(person1.Age) & " years old")
            ' Test the Alive property.
            If person1.Alive = True Then
                MsgBox(person1.FirstName & " is alive")
            Else
                MsgBox(person1.FirstName & " is no longer with us")
            End If
    
            With player1
                .FirstName = "Andrew"
                .LastName = "Cencini"
                .Number = 43
                .Position = "Shortstop" 'デバッグポイント3
            End With
            With player2
                .FirstName = "Robert"
                .LastName = "Lyon"
                .Number = 11
                .Position = "Catcher"
            End With
            test = player1.Position & " " & player1.FullName & ", #" & CStr(player1.Number) & " is now at bat." 'デバッグポイント4
            MsgBox(test)
            test = player2.Position & " " & player2.FullName & ", #" & CStr(player2.Number) & " is on deck."
            MsgBox(test)
        End Sub
    End Class
    


  6. デバッグ機能による動作確認
    (1)メニューの「デバッグ」_「デバッグ開始」を選択します。
    (2)Form1の画面が表示されます。
    (3)「Test実行」ボタンを押します。
    (4).FirstName = TextBox1.Text 'デバッグポイント1で停止します。
    (5)カーソルをデバッグポイント1の行にセットして、「右クリック」します。
    (6)「関数にステップイン」_「personsTest.Form1.get_TextBox」を選択します。
    (7)PersonsクラスのPublic Property FirstName() As StringのfirstNameValue = valueの行で停止します。
    (8)ここでvalueの値が「Microsoft」でfirstNameValueの値が「Nothing」であることを確認します。
    (9)すなわち、person1.FirstName = TextBox1.TextはPersonsクラスのPublic Property FirstName() As Stringを呼び出し、firstNameValueにTextBox1の値を代入することが確認できます。

    (10)引き続き「デバッグ」_「続行」を選択します。
    (11) Dim test As String = person1.FullName 'デバッグポイント2で停止します。
    (12)カーソルをデバッグポイント2の行にセットして、「右クリック」します。
    (13)「関数にステップイン」_「Persons.Persons.FullName」を選択します。
    (14)Personsクラスの Public Function FullName() As Stringで停止します。
    (15)FullNameに文字の加算処理結果が戻されることが理解できます。

    (16)引き続き「デバッグ」_「続行」を選択します。
    (17)メーセージボックスに「Microsoft Visual Basic」が表示されます。OKボタンを押します。
    (18)メーセージボックスに「3 years old」が表示されます。OKボタンを押します。
    (19)メーセージボックスに「Microsoft is alive」が表示されます。OKボタンを押します。
    (20) .Position = "Shortstop" 'デバッグポイント3で停止します。
    (21)カーソルをデバッグポイント2の行にセットして、「右クリック」します。
    (22)「関数にステップイン」_「Persons.Players.set_Position」を選択します。
    (23)PlayersクラスのPublic Property Position() As StringのSet(ByVal value As String)の行で停止します。
    (24)ここでvalueの値が「Shortstop」でpositionValueの値が「Nothing」であることを確認します。
    (25)すなわち、player1 .Position = "Shortstop"はPlayersクラスのPublic Property Position() As Stringを呼び出し、positionValueに"Shortstop"の値を代入することが確認できます。

    (26)引き続き「デバッグ」_「続行」を選択します。
    (27) test = player1.Position & " " & player1.FullName & ", #" & CStr(player1.Number) & " is now at bat." 'デバッグポイント4で停止します。
    (28)カーソルをデバッグポイント2の行にセットして、「右クリック」します。
    (29)「関数にステップイン」_「Persons.Players.get_Position」を選択します。
    (30)PlayersクラスのPublic Property Position() As StringのGetの行で停止します。
    (31)ここでPositionの値が「Nothing」でpositionValueの値が"Shortstop"」であることを確認します。
    (32)すなわち test = player1.Position は testに"Shortstop"を代入します。

    (33)引き続き「デバッグ」_「続行」を選択します。
    (34)メーセージボックスに「Shortstop Andrew Cencini,#43 is naw at bat」が表示されます。OKボタンを押します。
    (35)メーセージボックスに「Catcher Robert Lyon,#11 is on deck」が表示されます。OKボタンを押します。
    (36)クローズボックスをクリックして、プログラムを終了します。

    ・このサンプルの要所、要所にデバッグポイントを設定し、「右クリック」_「関数にステップイン」の機能を利用すると処理の流れの詳細を把握できます。各変数の各ステップ毎の変化を追跡すれば、クラスライブラリーの仕掛けの概要を理解できます。


  7. Personsクラスの変数設定の解説
        Private firstNameValue As String
        Private middleNameValue As String
        Private lastNameValue As String
        Public Alive As Boolean
        Private birthYearValue As Integer
    
    (1)クラスで使用する変数は通常 Privateとします。
    (2) Private変数は他のクラスから参照や変更ができなくなります。
    (3)他のクラスから参照や変更は通常 Propertyメソッドを使用します。
    (4)Publicで設定すると他のクラスから参照や変更ができますが、トラブルの原因となります。


  8. Personsクラスのメソッドの解説
        Public Function FullName() As String
        End Function
    ・FullNameを戻り値として戻します。
    
        Private Function CalcAge(ByVal year As Integer) As Integer
        End Function
    ・年齢を戻り値として戻します。
    
        Public Property FirstName() As String
            Get
                FirstName = firstNameValue
            End Get
            Set(ByVal value As String)
                firstNameValue = value
            End Set
        End Property
    ・firstNameValueの参照と変更を処理します。
    
        Public Property MiddleName() As String
                ’MiddleName = middleNameValue(詳細は省略)
        End Property
    ・middleNameValueの参照と変更を処理します。
    
        Public Property LastName() As String
               ’ LastName = lastNameValue(詳細は省略)
        End Property
    ・ lastNameValueの参照と変更を処理します。
    
        WriteOnly Property BirthYear() As Integer
            Set(ByVal value As Integer)
                birthYearValue = value
            End Set
        End Property
    ・birthYearValueの変更を処理します。
    
        ReadOnly Property Age() As String
            Get
                Age = CalcAge(birthYearValue)
            End Get
        End Property
    ・Ageを戻り値として戻します。
    
    (1)クラスのメソッドとしては、関数形(ファンクション)とProperty(プロパティ)形式があることがわかります。
    (2)ファンクションでクラス内のPrivate変数の値を変更するには、引数を用いる必要があります。
    (3)Property(プロパティ)形式では、引数を用いる必要がありません。(比較的新しい方式と思われます。)
    (4)ファンクションでもプロパティでも、参照と変更可、参照のみ、変更のみの3種が設定可能です。

  9. Playersクラスの変数設定の解説
        Inherits Persons
        Private numberValue As Integer
        Private positionValue As String
    
    (1)Inheritsはこのクラスの派生元のクラスの名前を指定します。従って親クラスはPersonsとなります。
    (2)Privateづnumber変数と positionValue変数を定義します。


  10. Playersクラスのメソッドの解説
        Public Property Number() As Integer
            Get
                Number = numberValue
            End Get
            Set(ByVal value As Integer)
                numberValue = value
            End Set
        End Property
    ・numberValueの参照と変更を処理します。
    
        Public Property Position() As String
            Get
                Position = positionValue
            End Get
            Set(ByVal value As String)
                positionValue = value
            End Set
        End Property
    ・positionValueの参照と変更を処理します。
    
    (1)PlayersクラスはPersonsクラスの子クラスとなります。
    (2)子クラスは親クラスの変数とメソッドを継承します。
    (3)クラスは整数型、実数型等変数型の拡張型といえます。
    (4)したがって、クラスを記載しただけでは、実行されません。
    (5)どこかのクラスでクラス型を指定して変数を定義したとき、初めて実行可能な形式となります。
    (6)従って、子クラスを生成すると自動的に親クラスも生成されます。
    (7)このような仕組みで親クラスと子クラスの関係を整理したものがクラスライブラリーと思われます。


  11. Form1クラスの変数設定の解説
        Dim person1 As New Persons.Persons
        Dim player1 As New Persons.Players
        Dim player2 As New Persons.Players
    
    (1) Dim person1 As New Persons.Personsは名称person1でPersons.Personsクラスを生成します。(Personsックラスの下のPersonsクラスということになります。ちょっと納得できませんが?)
    (2)Dim player1 As New Persons.Playersは名称player1でPersons.Playersクラスを生成します。
    (3)Dim player2 As New Persons.Playersは名称player2でPersons.Playersクラスを生成します。


  12. Form1クラスのメソッドの解説
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'プロパティ値のセット
            With person1
                .FirstName = TextBox1.Text 'デバッグポイント1
                .MiddleName = TextBox2.Text
                .LastName = TextBox3.Text
                .BirthYear = TextBox4.Text
                .Alive = CheckBox1.Checked
            End With
            ' Test the FullName method.
            Dim test As String = person1.FullName 'デバッグポイント2
            MsgBox(test)
    
            ' test the Age property and CalcAge method.
            MsgBox(CStr(person1.Age) & " years old")
            ' Test the Alive property.
            If person1.Alive = True Then
                MsgBox(person1.FirstName & " is alive")
            Else
                MsgBox(person1.FirstName & " is no longer with us")
            End If
    
            With player1
                .FirstName = "Andrew"
                .LastName = "Cencini"
                .Number = 43
                .Position = "Shortstop" 'デバッグポイント3
            End With
            With player2
                .FirstName = "Robert"
                .LastName = "Lyon"
                .Number = 11
                .Position = "Catcher"
            End With
            test = player1.Position & " " & player1.FullName & ", #" & CStr(player1.Number) & " is now at bat." 'デバッグポイント4
            MsgBox(test)
            test = player2.Position & " " & player2.FullName & ", #" & CStr(player2.Number) & " is on deck."
            MsgBox(test)
        End Sub
    
    
    (1) Private Sub Button1_ClickはButton1.Clickイベントで実行されます。
    (2)PersonsクラスとPlayersクラスの実行が記載されています。
    (3)実行はperson1やplayer1やplayer2といった実行変数名で実行されます。
    (4)実行変数名は他のクラスでは有効でありません。
    (5)他のクラスで実行変数名を必要とする場合は引数として渡す必要があります。


    感想:チュートリアル 5:Visual Basicのクラス構造テストの作成はVisual Basicの基本的な仕組みを理解する上でかなり参考になりました。
     Visual Basicは膨大な数のクラスで構成されていることは容易に類推できます。しかし、その全貌を理解するのは容易ではありません。しかし、その一部の仕組みが理解できた気がします。







7章:チュートリアル6:ピクチャの描画 : グラフィックスを使用するの作成に行く。

トップページに戻る。