shimapapa.io

.NET,VB,C#,AzureなどMS関連中心の技術ブログ

【VB.NET】「区分オブジェクト」のようなクラスを作れないか試行錯誤

前回の「区分オブジェクト」に関する投稿に引き続いて関連した投稿を。

rikupapa-shima.hatenablog.com

列挙型の区分ごとにプロパティを持たせる事ができないかなと思い、
実装してみたのが以下のような抽象クラスと具象クラスを使う形式。

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

実行すると以下のようになります。

f:id:rikupapa-shima:20191010231631p:plain

うーん・・・具象クラスのコンストラクタを全部書く必要があるのと、
Activator.CreateInstanceでType名をセットする部分があまりイケてない感じがする・・・

参考

aerodynamik.hatenablog.com