.net 面向对象、数据绑定和用户选择

.net 面向对象、数据绑定和用户选择,.net,oop,data-binding,polymorphism,strategy-pattern,.net,Oop,Data Binding,Polymorphism,Strategy Pattern,基本问题是使用数据绑定,您可以通过什么方式允许用户选择子类来执行此任务 具体例子。我有一个类,它接受CalculationMethod接口来进行计算。CalculationMethod有几个实现。GUI开发人员只希望使用数据绑定向用户提供选择 我采取了一些方法 最简单的方法是创建一个类,该类为所有实现返回一个CalculationMethod列表,并为显示目的向CalculationMethod添加一个Name属性 在此基础上,我有时会创建一个类,它使用反射来做同样的事情,并找到实现Calcul

基本问题是使用数据绑定,您可以通过什么方式允许用户选择子类来执行此任务

具体例子。我有一个类,它接受CalculationMethod接口来进行计算。CalculationMethod有几个实现。GUI开发人员只希望使用数据绑定向用户提供选择

我采取了一些方法

最简单的方法是创建一个类,该类为所有实现返回一个CalculationMethod列表,并为显示目的向CalculationMethod添加一个Name属性

在此基础上,我有时会创建一个类,它使用反射来做同样的事情,并找到实现CalculationMethod的所有类。这样,我就不必记得添加新的实现,但在web应用程序中可能很糟糕,因为它很昂贵,或者在不允许反射的环境中

有时我会添加一个枚举,每个枚举代表一个实现。有一个工厂方法接受枚举并返回正确的实现。这样GUI开发人员就可以绑定到枚举。如果用户选择必须以某种方式持久化,我通常会这样做

所有这些都有优点和缺点。是否有其他和/或更好的方法来做到这一点

下面的例子。GUI开发人员会将下拉列表或任何内容绑定到CalculationOptions.Calculations,允许用户选择。我不会写其他的例子,因为你应该明白。我将使用反射来获取继承CalculationTemplate的所有类,或者我将拥有一个表示所有继承类的枚举

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

在CalculationOptions类中添加一个名为AddCalculationOption的新函数,该函数将计算选项添加到列表中

使用当前对象在CalculationTemplate的构造函数中调用AddCalculationOption函数,并将name中的值作为参数返回

因此,当创建对象时,它会自动添加到列表中

您可以使用名称为名称和对象创建映射。工厂可以使用它返回适当的对象


我希望我正确地理解了你的问题。

举个假例子,以便更容易理解。不。我想你理解这个问题。我希望我能理解你的建议。您所建议的方法与我的示例中的共享方法略有不同。问题是,我或其他实现新策略或模板的开发人员必须记住将其添加到所述类中。我想避免必须记住的事情。