前回ただの犬になってしまった理由を突き止めるため、
Console.WriteLineをNewの入り口と出口にいれて確認します。
14 Public Class Dog : inherits Animal 15 Public myname As String = "犬" 16 Public msg As String = "ワンワン" 17 Sub New() 18 System.Console.WriteLine("Dog New") 19 MyBase.myname = Me.myname 20 MyBase.msg= Me.msg 21 System.Console.WriteLine("Dog New End") 22 End Sub 23 End Class 24 25 Public Class Doberman : inherits Dog 26 Public myname As String = "Doberman" 27 Public msg As String = "Bowwow" 28 Sub New() 29 System.Console.WriteLine("Doberman New") 30 MyBase.myname = Me.myname 31 MyBase.msg= Me.msg 32 System.Console.WriteLine("Doberman New End") 33 End Sub 34 End Class 35 36 Public Class TestClass 37 <STAThread()> _ 38 Shared Sub Main() 39 dim doberman as new Doberman() 40 doberman.Tell() 41 doberman.Bark() 42 End Sub 43 44 End Class
DogとDobermanのNewはどちらか早く実行されるのでしょうか。
takk@deb9:~/vbtest$ vbnc test.vb ~省略~ takk@deb9:~/vbtest$ mono test.exe Dog New Dog New End Doberman New Doberman New End 犬です ワンワン takk@deb9:~/vbtest$
DogのNewの実行が終わってから、DobermanのNewが実行されています。
ん~。先に親のNewが実行されるなら、Newの中で変数の書き換えをしていては、ずっとドーベルマンになってくれません。Newの引数で渡してみてはどうでしょうか。
takk@deb9:~/vbtest$ cat -n test.vb 1 Imports System.Console 2 3 Public Class Animal 4 Public myname As String = "動物" 5 Public msg As String = "" 6 Sub Tell() 7 WriteLine( myname & "です") 8 End Sub 9 Sub Bark() 10 WriteLine(msg) 11 End Sub 12 End Class 13 14 Public Class Dog : inherits Animal 15 Public myname As String = "犬" 16 Public msg As String = "ワンワン" 17 Sub New(myname as String, msg as String) 18 MyBase.myname = myname 19 MyBase.msg= msg 20 End Sub 21 End Class 22 23 Public Class Doberman : inherits Dog 24 Public myname As String = "Doberman" 25 Public msg As String = "Bowwow" 26 Sub New() 27 MyBase.New(Me.myname , Me.msg) 28 End Sub 29 End Class 30 31 Public Class TestClass 32 <STAThread()> _ 33 Public Sub Main() 34 dim doberman as new Doberman() 35 doberman.Tell() 36 doberman.Bark() 37 End Sub 38 39 End Class takk@deb9:~/vbtest$
ビルド。
takk@deb9:~/vbtest$ vbnc test.vb Visual Basic.Net Compiler version 0.0.0.5943 (Mono 4.0.1 - tarball) Copyright (C) 2004-2010 Rolf Bjarne Kvinge. All rights reserved. vbnc : error VBNC30737: No accessible 'Main' method with an appropriate signature was found in 'test'. There were 1 errors and 0 warnings. Compilation took 00:00:00.5038970 takk@deb9:~/vbtest$
なんと、エラーになりました。
オブジェクト指向、理解がまだまだ足りません。
コメント