トップ回答者
よくわからないコードの記述。

質問
-
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 ClassPublic Class Class1
Private strName As String
Private datBirthday As DatePublic Sub New(ByVal cst_name As String, ByVal _
cst_birthday As Date)
Name = cst_name
Birthday = cst_birthday
End SubPublic Property Name() As String
Get
Return strName
End GetSet(ByVal pro_name As String)
strName = pro_name
End Set
End PropertyPublic Property Birthday() As DateTime
Get
Return datBirthday
End GetSet(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 FunctionEnd Class
Public Class Class2
Inherits Class1
Private straddress As StringPublic 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 SetEnd 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には緑色の線が付きます。これだけのコードでは私の意図するプログラムは、実行できないのでしょうか?。私は本を参考にプログラムを学んでおり、時に訂正されていないコードにぶつかります。
- 編集済み bentensama 2014年4月18日 20:13
回答
-
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
-
「波線が出るけどなぜでしょうか」と済まさず、波線にカーソルを合わせてみましょう。
そうすると、「'manth' は 'Date' のメンバーではありません。」といったように、なぜかを示してくれます。
つまり、質問の一段階目としては Visual Studio が答えを出してくれています。この場合はスペルミスということで、指摘されれば気づけると思います。
質問の2つ目の緑色の方もカーソルを合わせればヒントが表示されています。
ヒントだけではわからなかったとしても、そこで得られた単語を元に検索してみる、それでもわからなければそのメッセージとともに質問するということをするだけでも解決が早くなるかもしれません。
- 回答としてマーク ひらぽんModerator 2014年4月23日 2:00
すべての返信
-
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
-
「波線が出るけどなぜでしょうか」と済まさず、波線にカーソルを合わせてみましょう。
そうすると、「'manth' は 'Date' のメンバーではありません。」といったように、なぜかを示してくれます。
つまり、質問の一段階目としては Visual Studio が答えを出してくれています。この場合はスペルミスということで、指摘されれば気づけると思います。
質問の2つ目の緑色の方もカーソルを合わせればヒントが表示されています。
ヒントだけではわからなかったとしても、そこで得られた単語を元に検索してみる、それでもわからなければそのメッセージとともに質問するということをするだけでも解決が早くなるかもしれません。
- 回答としてマーク ひらぽんModerator 2014年4月23日 2:00
-
> 私は本を参考にプログラムを学んでおり、時に訂正されていないコードにぶつかります。
確かに本には間違っている記述もあると思いますが、今回の場合も本の方が間違っていたのですか?
Visual Studio が「青い波線」で間違っている部分をピンポイントとしてくれたのですから、その部分と本の記述がどう違うか調べるのは 5 秒でできますよね?
それをやった上で、本の記述が訂正されていないという発言をされたのですか?
- 編集済み SurferOnWww 2014年4月19日 1:39 誤字訂正