※ 個人blogに投稿した記事(投稿日:2019/10/10)をQiitaに移行しました
前回の「区分オブジェクト」に関する投稿に引き続いて関連した投稿を。
列挙型の区分ごとにプロパティを持たせる事ができないかなと思い、
実装してみたのが以下のような抽象クラスと具象クラスを使う形式。
Public MustInherit Class Perfume
Public ReadOnly Property myFavorite As Boolean
Sub New(myFavorite As Boolean)
Me.myFavorite = myFavorite
End Sub
Public Class Nocchi
Inherits Perfume
Sub New(myFavorite As Boolean)
MyBase.New(myFavorite)
End Sub
End Class
Public Class Kashiyuka
Inherits Perfume
Sub New(myFavorite As Boolean)
MyBase.New(myFavorite)
End Sub
End Class
Public Class AaChan
Inherits Perfume
Sub New(myFavorite As Boolean)
MyBase.New(myFavorite)
End Sub
End Class
End Class
クラス名からインスタンスを生成するにはActivator.CreateInstance
、
区分の判定はGetType
で列挙型と同様に行えます。
Module Module1
Sub Main()
Dim myPerfume = createMyFavoriteMember("Nocchi")
Select Case myPerfume.GetType()
Case GetType(Perfume.Nocchi)
' ...
Case GetType(Perfume.Kashiyuka)
' ...
Case GetType(Perfume.AaChan)
' ...
End Select
End Sub
Private Function createMyFavoriteMember(memberName As String) As Perfume
Return CType(Activator.CreateInstance(
Type.GetType("Enumeration.Perfume+" & memberName),
New Object() {True}), Perfume)
End Function
End Module
実行すると以下のようになります。
うーん・・・具象クラスのコンストラクタを全部書く必要があるのと、
Activator.CreateInstance
でType名をセットする部分があまりイケてない感じがする・・・