ООП, привязка данных и выбор пользователя - PullRequest
1 голос
/ 21 июня 2011

Основной вопрос - использование привязки данных. Каким образом вы можете позволить пользователю выбрать подкласс для выполнения работы?

Конкретный пример. У меня есть класс, который принимает 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

1 Ответ

0 голосов
/ 28 сентября 2011

Добавьте новую функцию с именем AddCalculationOption () в классе CalculationOptions, которая добавляет параметры расчета в список.

Вызовите функцию AddCalculationOption в конструкторе CalculationTemplate с текущим объектом и верните значение name () в качестве аргументов.

Таким образом, когда объект создается, он автоматически добавляется в список.

Вы можете использовать имя, чтобы иметь карту для имени и объекта.который может использоваться фабрикой для возврата соответствующего объекта.

Надеюсь, я правильно понял ваш вопрос.

...