今日、ファクトリ メソッドを介してサブクラスのインスタンスを作成する際に問題が発生しました。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
すべてのサブクラスを独自のファイルに入れることができます。しかし、これは私を本当に満足させるものではありません。不器用でエレガントではないようです。