Я написал базовый класс, из которого я хочу получить несколько дочерних классов (в данном случае классы 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 () и показывает форму.