またmonoのvbncに戻ります。
プロパティを使ったAnimalクラスはこうなってました。
3 Public Class Animal 4 Private _classname As String = "哺乳類" 5 Public ReadOnly Property Classname() As String 6 Get 7 Return _classname 8 End Get 9 End Property 10 Private _myname As String 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 20 Sub Tell() 21 WriteLine( classname & "です") 22 End Sub 23 End Class
ReadOnlyはともかく、GetとSetがあるPropertyってただの変数と何が違うのでしょう。
MynameについてPublicの変数にしたクラスと比べてみます。
3 Public Class Animal 4 Private _classname As String = "哺乳類" 5 Public ReadOnly Property Classname() As String 6 Get 7 Return _classname 8 End Get 9 End Property 10 Public Myname As String 11 12 Sub Tell() 13 WriteLine( classname & "です") 14 End Sub 15 End Class
正直違いがわかりません。変数に直接アクセスするか、しないかの違いだけのように思えます。まあ、それが大きいのでしょうけど。
オブジェクト指向だから、データに直接アクセスはおかしい、と考えるなら、オブジェクト指向らしく、名前を付けるふるまいとしてName()というメソッドで実装する方が、SetやGetよりも分かりやすい気もします。AnimalにSetするって表現がおかしいですし。
AnimalにNameする形でクラスを書き直してみました。
3 Public Class Animal 4 Private _classname As String = "哺乳類" 5 Public ReadOnly Property Classname() As String 6 Get 7 Return _classname 8 End Get 9 End Property 10 Private _myname As String = "" 11 Public Sub Name(v As String) 12 _myname = v 13 End Sub 14 15 Sub Tell() 16 WriteLine( _classname & "です") 17 End Sub 18 End Class
オブジェクト指向らしく、って考えていると要らないことばかり考えて、クラスが書けなくなるんですよねえ。
たとえば、動物に名前を付けるのって、つける側で認識しているだけだから、動物側って自分の名前を知らないんだよなあ・・・そうなると、Animalクラスに名前の変数は存在しなくなり・・・となって、こうなってしまいます。
3 Public Class Animal 4 Private _classname As String = "哺乳類" 5 Public ReadOnly Property Classname() As String 6 Get 7 Return _classname 8 End Get 9 End Property 10 Public Sub Name(v As String) 11 End Sub 12 13 Sub Tell() 14 WriteLine( _classname & "です") 15 End Sub 16 End Class
Nameメソッドは呼び出しされますが、当のAnimal君は、自分が名前を付けられたことを知らないので、何もしません。
なんじゃこりゃあ。
と、オブジェクト指向らしく、と考えていくと設計が固まりません。
別に、オブジェクト指向脱線してもよいのでは、と日々思います。
コメント