Использование инициализаторов объектов VB.NET в шаблоне фабрики - PullRequest
1 голос
/ 31 марта 2012

Я написал базовый класс, из которого я хочу получить несколько дочерних классов (в данном случае классы Windows Form), и я использую шаблон Factory, чтобы поддерживать коллекцию дочерних экземпляров, чтобы формаможет иметь только один экземпляр для каждого значения первичного ключа (своего рода смесь шаблонов 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 }

Есть ли способ объединить эти два метода, поэтому у меня есть фабрика и инициализатор?

Я не ищу:

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

... потому чтоБазовый класс также имеет метод ShowForm (), который принимает дополнительные параметры базовой формы, оборачивает функцию GetForm () и показывает форму.

Ответы [ 2 ]

1 голос
/ 01 апреля 2012

Чтобы получить истинные инициализаторы объектов, по определению вы должны использовать 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 может возвращать другой тип, который может иметь больше или меньше доступных свойств и методов), не нужны.

0 голосов
/ 01 апреля 2012

Наш метод 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...