我想建立一个对给定的数学函数进行运算的类。给定的数学函数可能很简单,也可能非常复杂,但始终具有:
为了争辩,假设我只想打印这些函数的结果,实际上操作会很复杂(例如,迭代查找根)。
除了将可变数量的参数添加到字典之外,我不确定有其他更好的方法来实现此目的,这样我就可以始终将给定的函数作为委托传递。
这里是我所拥有的:
Sub RunTest()
Dim myvars As New Dictionary(Of String, Double) From {
{"a", 3},
{"b", 2},
{"c", 1},
{"d", -1}
}
Dim MyTest1, MyTest2 As MyTestClass
MyTest1 = New MyTestClass(AddressOf CubicTest, 1.123, myvars)
MyTest2 = New MyTestClass(AddressOf QuadTest, 1.123, myvars)
MyTest1.TestPrint()
MyTest2.TestPrint()
End Sub
Function CubicTest(ByVal xAs Double, ByVal var As Dictionary(Of String, Double)) As Double
Return var("a") * x^ 3 + var("b") * x^ 2 + var("c") * x + var("d")
End Function
Function QuadTest(ByVal xAs Double, ByVal var As Dictionary(Of String, Double)) As Double
Return var("b") * x^ 2 + var("c") * x + var("d")
End Function
Class MyTestClass
Private BaseFunction As FunctionByRef
Private TestValue As Double
Private Variables As Dictionary(Of String, Double)
Delegate Function FunctionByRef(ByVal TestValue As Double, ByVal Variables As Dictionary(Of String, Double)) As Double
Sub New(ByVal BaseFunction As FunctionByRef, ByVal TestValue As Double, ByVal Variables As Dictionary(Of String, Double))
Me.BaseFunction = BaseFunction
Me.TestValue = TestValue
Me.Variables = Variables
End Sub
Sub TestPrint()
Debug.Print(Me.BaseFunction(Me.TestValue, Me.Variables).ToString())
End Sub
End Class
似乎工作正常,但也很笨重。
是否有更清洁的方法来完成此任务?
作为一般示例:
Private Sub ExecuteDoubleFunction(method As [Delegate], ParamArray args As Object())
Dim result = DirectCast(method.DynamicInvoke(args), Double)
'Use result here.
End Sub
然后,您可以将返回类型为Double
的任何委托传递给该方法,并且可以将参数作为单个数组或离散值进行传递。这意味着您可以使用AddressOf
为使用Lambda表达式的常规方法创建委托。