1

今日、ファクトリ メソッドを介してサブクラスのインスタンスを作成する際に問題が発生しました。BaseClass抽象基本クラスと 2 つのサブクラスSubClass1およびを持つ単純な型階層があるとしSubClass2ます。次のコードのように、入力パラメータに応じて両方のサブクラスのインスタンスを作成するファクトリ メソッドが必要です。

MustInherit Class BaseClass
    Public Shared Function CreateInstance(x As Integer) As BaseClass
        If x > 1000 Then
            Return New SubClass1
        Else
            Return New SubClass2
        End If
    End Function
End Class

Class SubClass1
    Inherits BaseClass

    Sub New()
    End Sub
End Class

Class SubClass2
    Inherits BaseClass

    Sub New()
    End Sub
End Class

これは完全に正常に機能します。しかし、さらに、ファクトリ メソッドを使用せずにサブクラスのインスタンス化を防止したいと考えています。

したがって、私の最初のアイデアは、サブクラスのコンストラクターを Protectedにすることでしたが、Protectedは基本クラスまでではなく、継承ラインでのみ機能することがわかりました。

次に、ファクトリ メソッドでActivator.CreateInstanceを使用してみました。これにより、コンパイル可能なコードが生成されますが、ランタイム例外がスローされます (保護されたコンストラクターにアクセスできないため)。

ファクトリ メソッドは通常、インターフェイス型を外部 (他のアセンブリ) に返すために使用されることを理解していますが、コードの他の場所でコンストラクターを誤って使用することから同じレベルの保護が必要です。もちろん、これ用に独自のアセンブリを作成し、サブクラスのコンストラクターをFriendにしますが、これはオプションではありません (何十ものアセンブリが作成されることになります...)。

私がやりたいことは概念的に間違っていますか?コードを間違った方法で使用しないように、自分 (および同僚) を保護する必要はありませんか?

4 お世話になりました!

編集:

1 つの可能性は、サブクラスを のようにプライベート クラスにすることBaseClassです。

MustInherit Class BaseClass
    Public Shared Function CreateInstance(x As Integer) As BaseClass
        If x > 1000 Then
            Return New SubClass1
        Else
            Return New SubClass2
        End If
    End Function

    Private Class SubClass1
        Inherits BaseClass

        Sub New()
        End Sub
    End Class

    Private Class SubClass2
        Inherits BaseClass

        Sub New()
        End Sub
    End Class
End Class

Partial キーワードを使用して複数のファイルに分割し、BaseClassすべてのサブクラスを独自のファイルに入れることができます。しかし、これは私を本当に満足させるものではありません。不器用でエレガントではないようです。

4

1 に答える 1

0

You should check out this Access Levels from Microsoft. As @LarsTech said, Friend is your answer, as long as you are creating your own library/dll.

于 2013-10-25T16:12:13.773 に答える