Основной вопрос - использование привязки данных. Каким образом вы можете позволить пользователю выбрать подкласс для выполнения работы?
Конкретный пример. У меня есть класс, который принимает CalculationMethod (интерфейс), чтобы сделать расчет. Есть несколько реализаций CalculationMethod. Разработчик графического интерфейса хочет использовать привязку данных только для представления выбора пользователю.
Я выбрал несколько подходов.
Самый простой - создать класс, который возвращает список (для CalcuationMethod) для всех реализаций, и добавить свойство Name в CalculationMethod для отображения.
Расширяя это, я иногда создаю класс, который использует отражение, чтобы сделать то же самое (находит все классы, которые реализуют CalculationMethod). Таким образом, мне не нужно добавлять новые реализации, но это может быть плохо в веб-приложениях (это дорого) или в средах, которые не допускают отражения.
Иногда я добавлял перечисление, где каждое перечисление представляет реализацию. Существует фабричный метод, который принимает перечисление и возвращает правильную реализацию. Таким образом, разработчик GUI может связываться с перечислением. Я часто делаю это, если выбор пользователя должен быть каким-то образом сохранен.
Все вышеперечисленное имеет свои преимущества и недостатки. Есть ли другие и / или лучшие способы сделать это?
Пример ниже. Разработчик графического интерфейса привязывает выпадающий список (или любой другой) к CalculationOptions.Calculations, позволяющему пользователю выбирать. Я не буду писать другие примеры, потому что вы должны понять. (Я бы использовал отражение, чтобы получить все классы, которые наследуют CalculatoinTemplate, или у меня было бы перечисление, представляющее все классы, которые наследуют.)
Public Class CalculationTemplate
Public MustOverride Readonly Property Name() as string
Public MustOverride Sub Calculate()
End Class
Public Class CalculationImp1
Public Overrides Sub Calculate()
End Sub
Public Overrides Readonly Property Name() as String
Get
Return "Imp1"
End Get
End Property
End Class
Public Class CalculationImp2
Public Overrides Sub Calculate()
End Sub
Public Overrides Readonly Property Name() as String
Get
Return "Imp2"
End Get
End Property
End Class
Public Class CalculationOptions
Public Shared Function Calculations() as List(Of CalculationTemplate)
Dim lst as New List(Of CalculationTemplate)
lst.add(new CalculationImp1)
lst.add(new CalculationImp2)
Return lst
End Function
End Class