none
よくわからないコードの記述。 RRS feed

  • 質問

  • Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim person As New Class2(TextBox1.Text, DateTimePicker1.Value.Date, TextBox2.Text)

          
            MessageBox.Show(person.name & "さんの年齢は" & CStr(person.getage()) & "歳です。" & vbCrLf & "住所は" )
        End Sub
    End Class

    Public Class Class1
        Private strName As String
        Private datBirthday As Date

        Public Sub New(ByVal cst_name As String, ByVal _
                       cst_birthday As Date)
            Name = cst_name
            Birthday = cst_birthday
        End Sub

        Public Property Name() As String
            Get
                Return strName
            End Get

            Set(ByVal pro_name As String)
                strName = pro_name
            End Set
        End Property

        Public Property Birthday() As DateTime
            Get
                Return datBirthday
            End Get

            Set(ByVal pro_birtuday As Date)
                datBirthday = pro_birtuday
            End Set
        End Property
        Public Overridable Function getage() As Integer
            Dim age As Integer = Today.yaer - datBirthday.yaer
            If Today.manth < datBirthday.Month OrElse
                Today.Month = datBirthday.Month AndAlso
                    Today.Day < datBirthday.Day Then
                age = age - 1
            End If
            Return age
        End Function

    End Class

    Public Class Class2
        Inherits Class1
        Private straddress As String

        Public Sub New(ByVal cst_name As String, ByVal cst_birthday As Date, cst_address As String)
            MyBase.New(cst_name, cst_birthday)
            straddress = cst_address
        End Sub
        Public Property address() As String
            Get
                Return straddress
            End Get
            Set(pro_name As String)
                straddress = pro_name
            End Set

        End Property
        Public Property address(() As string
            Get
                Return stradress
            End Get
            Set(pro_address)
                straddress = probirthday
            End Set
        End Property
        Public Overridable Function getage() As Integer
            MessageBox.Show("入力された日付をもとにして年齢を計算します")
            Return MyBase.getage()
        End Function


    End Class

    このコードでdatbirthday.yaerとtoday.monthとtoday.monthに青い波腺が付きます、どうしてでしょう。なぜかがお分かりの方は教えてください。

    getageには緑色の線が付きます。これだけのコードでは私の意図するプログラムは、実行できないのでしょうか?。私は本を参考にプログラムを学んでおり、時に訂正されていないコードにぶつかります。



    2014年4月18日 20:11

回答

  • Public Class Class1
        Public Overridable Function getage() As Integer
            'yaer->Year   manth ->Month
            Dim age As Integer = Today.Year - datBirthday.Year
            If Today.Month < datBirthday.Month OrElse
                Today.Month = datBirthday.Month AndAlso
                    Today.Day < datBirthday.Day Then
                age = age - 1
            End If
            Return age
        End Function
    End Class

    class1の方は単にプロパティのつづりを書き間違いですね。
    青線がでている箇所にカーソルを合わせてCtrl+Spaceを押してみましょう。そうすると入力候補一覧が表示されるので、正しいプロパティを選べます。
    途中まで入力しているときの入力候補一覧でも、選択してALT+→でのこりの文字が自動で入力されるので、打ち間違いが減らせます。
    VisualStudioには便利機能があるので、使えるようになるとプログラムが楽になりますよ。

    Public Class Class2
        Inherits Class1
        Private straddress As String
    
        Public Sub New(ByVal cst_name As String, ByVal cst_birthday As Date, cst_address As String)
            MyBase.New(cst_name, cst_birthday)
            straddress = cst_address
        End Sub
    
        Public Overloads Property address() As String
            Get
                Return straddress
            End Get
            Set(pro_name As String)
                straddress = pro_name
            End Set
    
        End Property
    
        '同じ名前、同じ引数のプロパティは同時に宣言することはできません
        '引数を変えれば可能です。(Overloads)
        Public Overloads Property address(ByVal index As Integer) As String 'かっこが余計にある
            Get
                Return straddress
            End Get
            Set(pro_address As String)
                straddress = pro_address
            End Set
        End Property
    
        Public Overrides Function getage() As Integer
            MessageBox.Show("入力された日付をもとにして年齢を計算します")
            Return MyBase.getage()
        End Function
    End Class

    Class1のOverridableはオーバーライドできますよという宣言で、Class2のOverridesはオーバーライドしますよという宣言です。

    あと、Class2でaddressプロパティが2回宣言されていますが、同じ宣言はひとつのみです。
    引数が異なる場合は別の宣言とみなされるので可能です。(Overloadsを使います)


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)


    • 編集済み gekkaMVP 2014年4月19日 0:38 オーバーロードとオーバーライドの書き間違い訂正
    • 回答としてマーク bentensama 2014年4月19日 2:12
    2014年4月18日 23:16
  • 「波線が出るけどなぜでしょうか」と済まさず、波線にカーソルを合わせてみましょう。
    そうすると、「'manth' は 'Date' のメンバーではありません。」といったように、なぜかを示してくれます。
    つまり、質問の一段階目としては Visual Studio が答えを出してくれています。

    この場合はスペルミスということで、指摘されれば気づけると思います。

    質問の2つ目の緑色の方もカーソルを合わせればヒントが表示されています。
    ヒントだけではわからなかったとしても、そこで得られた単語を元に検索してみる、それでもわからなければそのメッセージとともに質問するということをするだけでも解決が早くなるかもしれません。

    2014年4月18日 23:45
    モデレータ

すべての返信

  • Public Class Class1
        Public Overridable Function getage() As Integer
            'yaer->Year   manth ->Month
            Dim age As Integer = Today.Year - datBirthday.Year
            If Today.Month < datBirthday.Month OrElse
                Today.Month = datBirthday.Month AndAlso
                    Today.Day < datBirthday.Day Then
                age = age - 1
            End If
            Return age
        End Function
    End Class

    class1の方は単にプロパティのつづりを書き間違いですね。
    青線がでている箇所にカーソルを合わせてCtrl+Spaceを押してみましょう。そうすると入力候補一覧が表示されるので、正しいプロパティを選べます。
    途中まで入力しているときの入力候補一覧でも、選択してALT+→でのこりの文字が自動で入力されるので、打ち間違いが減らせます。
    VisualStudioには便利機能があるので、使えるようになるとプログラムが楽になりますよ。

    Public Class Class2
        Inherits Class1
        Private straddress As String
    
        Public Sub New(ByVal cst_name As String, ByVal cst_birthday As Date, cst_address As String)
            MyBase.New(cst_name, cst_birthday)
            straddress = cst_address
        End Sub
    
        Public Overloads Property address() As String
            Get
                Return straddress
            End Get
            Set(pro_name As String)
                straddress = pro_name
            End Set
    
        End Property
    
        '同じ名前、同じ引数のプロパティは同時に宣言することはできません
        '引数を変えれば可能です。(Overloads)
        Public Overloads Property address(ByVal index As Integer) As String 'かっこが余計にある
            Get
                Return straddress
            End Get
            Set(pro_address As String)
                straddress = pro_address
            End Set
        End Property
    
        Public Overrides Function getage() As Integer
            MessageBox.Show("入力された日付をもとにして年齢を計算します")
            Return MyBase.getage()
        End Function
    End Class

    Class1のOverridableはオーバーライドできますよという宣言で、Class2のOverridesはオーバーライドしますよという宣言です。

    あと、Class2でaddressプロパティが2回宣言されていますが、同じ宣言はひとつのみです。
    引数が異なる場合は別の宣言とみなされるので可能です。(Overloadsを使います)


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)


    • 編集済み gekkaMVP 2014年4月19日 0:38 オーバーロードとオーバーライドの書き間違い訂正
    • 回答としてマーク bentensama 2014年4月19日 2:12
    2014年4月18日 23:16
  • 「波線が出るけどなぜでしょうか」と済まさず、波線にカーソルを合わせてみましょう。
    そうすると、「'manth' は 'Date' のメンバーではありません。」といったように、なぜかを示してくれます。
    つまり、質問の一段階目としては Visual Studio が答えを出してくれています。

    この場合はスペルミスということで、指摘されれば気づけると思います。

    質問の2つ目の緑色の方もカーソルを合わせればヒントが表示されています。
    ヒントだけではわからなかったとしても、そこで得られた単語を元に検索してみる、それでもわからなければそのメッセージとともに質問するということをするだけでも解決が早くなるかもしれません。

    2014年4月18日 23:45
    モデレータ
  • > 私は本を参考にプログラムを学んでおり、時に訂正されていないコードにぶつかります。

    確かに本には間違っている記述もあると思いますが、今回の場合も本の方が間違っていたのですか?

    Visual Studio が「青い波線」で間違っている部分をピンポイントとしてくれたのですから、その部分と本の記述がどう違うか調べるのは 5 秒でできますよね?

    それをやった上で、本の記述が訂正されていないという発言をされたのですか?


    • 編集済み SurferOnWww 2014年4月19日 1:39 誤字訂正
    2014年4月19日 1:38
  • 初めに返信するべきところ、手違いで返信されなかったようなので、もう一度書き込みますが、ご説明のとうりでした。私のミスと重なって、本にも記述されていない部分が、あったので大変参考になりました。プログラムは実行されました。ありがとう。

    2014年4月19日 2:21