1

いくつかの子クラス (この場合は Windows フォーム クラス) を派生させたい基本クラスを作成しました。子インスタンスのコレクションを維持するために Factory パターンを使用しているため、フォームは主キー値ごとに 1 つのインスタンス (Factory パターンと Singleton パターンのマッシュアップのようなもの)。

基本フォーム クラスで次のコードを使用しています。

Public Class PKSingletonForm
   Inherits Form

   Protected _PKValue As Int32 = 0
   Protected _strFormKey As String = ""
   Protected Shared _dictForms As New Dictionary(Of String, PKSingletonForm)

   Public Shared Function GetForm(Of T As {PKSingletonForm, New})(Optional ByVal PKValue As Int32 = 0) As T
      '** Create the key string based on form type and PK.
      Dim strFormKey As String = GetType(T).Name & "::" & PKValue.ToString

      '** If a valid instance of the form with that key doesn't exist in the collection, then create it.
      If (Not _dictForms.ContainsKey(strFormKey)) OrElse (_dictForms(strFormKey) Is Nothing) OrElse (_dictForms(strFormKey).IsDisposed) Then
         _dictForms(strFormKey) = New T()
         _dictForms(strFormKey)._PKValue = PKValue
         _dictForms(strFormKey)._strFormKey = strFormKey
      End If

      Return DirectCast(_dictForms(strFormKey), T)
   End Function
End Class

アイデアは、次のように、基本フォームから継承する子フォーム (たとえば、UserInfoForm と呼ばれる) を作成し、ユーザー #42 のインスタンスを作成することです。

Dim formCurrentUser = PKSingletonForm.GetForm(of UserInfoForm)(42)

これはすべて意図したとおりに機能します。

ただし、UserInfoForm には、設定したいプロパティがいくつかあります。フォームがファクトリによって作成された後ではなく、オブジェクト初期化子を使用して設定したいと思います。

Dim formCurrentUser As New UserInfoForm With { .ShowDeleteButton = False, .ShowRoleTabs = False }

これらの 2 つの方法を組み合わせる方法はありますか?そのため、ファクトリとイニシャライザがありますか?

私は探していません:

Dim formCurrentUser = PKSingletonForm.GetForm(of UserInfoForm)(42)
formCurrentUser.ShowDeleteButton = False
formCurrentUser.ShowRoleTabs = False

...基本クラスには、追加の基本フォーム パラメータを取得し、GetForm() 関数をラップしてフォームを表示する ShowForm() メソッドも含まれているためです。

4

2 に答える 2

1

New真のオブジェクト初期化子を取得するには、定義により...を使用する必要がありますWith

また、新しいオブジェクトを作成したくない場合があるためそれはオプションではありません。

他の要件に応じて、ソリューションは毎回新しいオブジェクトを使用するように変更することができますが、内部にシングルトンをカプセル化するか、次のようなものを使用します。

Dim formCurrentUser As UserInfoForm 
With PKSingletonForm.GetForm(of UserInfoForm)(42)
  .ShowDeleteButton = False
  .ShowRoleTabs = False
  formCurrentUser = .Self
End With

Dim formCurrentUser = PKSingletonForm.GetForm(of UserInfoForm)(42) : With formCurrentUserこれは、上記の構成で利用可能な追加の機能 (つまり、GetForm利用可能なプロパティとメソッドが多かれ少なかれ別の型を返すことができる) が必要ない場合に簡略化できます。

于 2012-04-01T04:02:27.460 に答える
0

ShowForm() メソッドは次のように記述されています。

Public Shared Sub ShowForm(Of T As {BaseForm, New})(Optional ByVal PKValue As Int32 = 0, <Several Parameters Here>)

   Dim formShown As BaseForm = GetForm(Of T)(PKValue, isRepeatable)

   <Do Stuff with Parameters Here>

   formShown.Show()
   formShown.BringToFront()
End Sub

私たちの解決策は、Shared (および Generics) を取り出して、ShowForm() を次のように単純化することでした。

Public Sub ShowForm(<Several Parameters Here>)

   <Do Stuff with Parameters Here>

   Me.Show()
   Me.BringToFront()
End Sub

そうすれば、次のように書くことができます。

Dim formCurrentUser = PKSingletonForm.GetForm(of UserInfoForm)(42)
formCurrentUser.ShowDeleteButton = False
formCurrentUser.ShowRoleTabs = False
formCurrentUser.ShowForm(blah, blah)

...としても:

Dim formCurrentUser = PKSingletonForm.GetForm(of UserInfoForm)(42).ShowForm()
于 2012-04-01T04:08:09.860 に答える