Linux(mono)でVB、プロパティ

次はプロパティを使っていきます。
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$

リードオンリーのプロパティを書き換えしようとしたら、けたたましくエラーが出ました。

コメント

タイトルとURLをコピーしました