我正在Windows窗体中编写C#代码,该窗体使用Simpson规则来计算特定函数的数学积分。
我的程序已经完成,但我想让它更具动态性并为我的form1.cs [design]添加额外的功能。我想使用继承和多态来扩展我的类,以便采用不同的集成函数。
这将是我表单中非常有用的功能,但我找不到任何相关的功能。有谁知道如何将此功能添加到我现有的计算器代码中?
这就是我目前使用Simpson规则定义要集成的函数的方法。
public virtual double funct(double x)
{
return 2 / (1 + 4*(x * x));
}
当我从那里更改函数时,我的form1.cs [design]给出了正确的结果.......但是我希望能够从我的form.cs中选择不同的函数(任何集成函数) [设计]
答案 0 :(得分:1)
我不确定你为什么要通过多元主义这样做。
您应该将该函数存储为变量:
Func<double, double> function; //represents a method that takes one double argument and returns a double
将您的示例分配给function
非常简单:
function = (double x) => 2 / (1 + 4 * (x * x));
我会像这样创建一个接口IFunctionIntegrator
:
public interface IFunctionIntegrator
{
double Integrate(Func<double, double> function, double lowerLimit, double upperLimit);
}
现在,您可以通过在构造函数中注入Form
,轻松地将IFunctionIntegrator
实现与集成逻辑分离。 Allways 尝试尽可能地将您的UI与应用程序逻辑分离,这将为您节省许多麻烦。
public partial class MyForm: Form
{
IFunctionIntegrator integrator;
public MyForm() {...}
public MyForm(IFunctionIntegrator integrator)
:this()
{
this.integrator = integrator;
}
public double IntegrateFunction(Func<double, double> function, double lowerLimit, double upperLimit)
{
return this.integrator.Integrate(function, lowerLimit, upperLimit);
}
}
将您的集成逻辑移至IFunctionIntegrator
的具体实现:
public class SimpsonRuleFunctionIntegrator: IFunctionIntegrator
{
public double Integrate(Func<double, double> function, double lowerLimit, double upperLimit)
{
//Simpson integration implementation here.
}
}
这种方法的优点是什么?您不仅可以灵活地选择“任何”功能,还可以灵活地选择任何明确的集成算法,而无需更改任何代码;您只需要添加IFunctionIntegrator
的新实现。
public TrapezoidalRuleFunctionIntegrator: IFunctionIntegrator {...}
public RectangleRuleFunctionIntegrator: IFunctionIntegrator {...}
如何在Form
中实施选择有效功能是另一回事。这些是否会建立在功能中?否则,您需要实现数学parser或表达式构建器来验证和解释提交的函数,这是一个完全不同的球赛。