次はプロパティを使っていきます。
AnimalクラスにPrivateの_myname変数を追加して、変数にアクセスするためのMynameプロパティを実装しました。Getは値の取得、Setは値の設定です。
takk@deb9:~/vbtest$ cat -n test.vb 1 Imports System.Console 2 3 Public Class Animal 4 Public classname As String = "哺乳類" 5 Private _myname As String 6 Public Property Myname() As String 7 Get 8 Return _myname 9 End Get 10 Set(ByVal value As String) 11 _myname = value 12 End Set 13 End Property 14 Sub Tell() 15 WriteLine( classname & "です") 16 End Sub 17 End Class 18 19 Public Class Dog : inherits Animal 20 Public familyname As String = "犬" 21 Sub Tell() 22 WriteLine( MyBase.classname & "で" & familyname & "です。" & _ 23 "名前を" & Myname & "といいます。" ) 24 End Sub 25 Sub Bark() 26 WriteLine( "Bowwow" ) 27 End Sub 28 End Class 29 30 Public Class TestClass 31 <STAThread()> _ 32 Shared Sub Main() 33 dim dog as new Dog() 34 dog.Myname = "ケンケン" 35 dog.Tell() 36 dog.Bark() 37 End Sub 38 39 End Class takk@deb9:~/vbtest$
実行すると、
takk@deb9:~/vbtest$ vbnc test.vb ~省略~ takk@deb9:~/vbtest$ mono test.exe 哺乳類で犬です。名前をケンケンといいます。 Bowwow takk@deb9:~/vbtest$
Animalクラスに_myname変数を組み込んだのは、動物が何か分からなくても名前が付けることができるからです。
逆に哺乳類という分類は変わることがないので、リードオンリーのプロパティにしてみます。
takk@deb9:~/vbtest$ cat -n test.vb 1 Imports System.Console 2 3 Public Class Animal 4 Private _classname As String = "哺乳類" 5 Private _myname As String 6 Public ReadOnly Property Classname() As String 7 Get 8 Return _classname 9 End Get 10 End Property 11 Public Property Myname() As String 12 Get 13 Return _myname 14 End Get 15 Set(ByVal value As String) 16 _myname = value 17 End Set 18 End Property 19 Sub Tell() 20 WriteLine( classname & "です") 21 End Sub 22 End Class 23 24 Public Class Dog : inherits Animal 25 Public familyname As String = "犬" 26 Sub Tell() 27 WriteLine( MyBase.classname & "で" & familyname & "です。" & _ 28 "名前を" & Myname & "といいます。" ) 29 End Sub 30 Sub Bark() 31 WriteLine( "Bowwow" ) 32 End Sub 33 End Class 34 35 Public Class TestClass 36 <STAThread()> _ 37 Shared Sub Main() 38 dim dog as new Dog() 39 dog.Classname = "爬虫類" 40 End Sub 41 42 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 : Command line : error VBNC99999: Unexpected error: The method or operation is not implemented. at vbnc.CecilHelper.GetCorrectMember (Mono.Cecil.MethodReference Member, Mono.Cecil.TypeReference Type, System.Boolean Emittable) [0x0005f] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 at vbnc.PropertyAccessClassification.GenerateCode (vbnc.EmitInfo Info) [0x000bb] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 at vbnc.AssignmentStatement.GenerateCode (vbnc.EmitInfo Info) [0x00025] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 at vbnc.CodeBlock.GenerateCode (vbnc.EmitInfo Info) [0x0014a] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 at vbnc.CodeBlock.GenerateCode (vbnc.IMethod Method) [0x00061] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 at vbnc.MethodBaseDeclaration.GenerateCode (vbnc.EmitInfo Info) [0x000ba] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 at vbnc.MethodDeclaration.GenerateCode (vbnc.EmitInfo Info) [0x00007] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 at vbnc.SubDeclaration.GenerateCode (vbnc.EmitInfo Info) [0x00046] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 at vbnc.Helper.GenerateCodeCollection (System.Collections.IEnumerable Collection, vbnc.EmitInfo Info) [0x00037] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 at vbnc.BaseObjects`1[T].GenerateCode (vbnc.EmitInfo Info) [0x00001] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 at vbnc.AssemblyDeclaration.Emit (vbnc.TypeDeclaration Type) [0x00031] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 at vbnc.AssemblyDeclaration.Emit () [0x0005f] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 at vbnc.Compiler.Compile () [0x005b3] in <d77f4191aaaa4ed9a9a36d67dd32844d>:0 Compilation took 00:00:00.4572370 takk@deb9:~/vbtest$
リードオンリーのプロパティを書き換えしようとしたら、けたたましくエラーが出ました。
コメント