数学函数计算器的继承/多态性

时间:2014-11-16 10:42:29

标签: c# inheritance polymorphism integration

我正在Windows窗体中编写C#代码,该窗体使用Simpson规则来计算特定函数的数学积分。

我的程序已经完成,但我想让它更具动态性并为我的form1.cs [design]添加额外的功能。我想使用继承和多态来扩展我的类,以便采用不同的集成函数。

这将是我表单中非常有用的功能,但我找不到任何相关的功能。有谁知道如何将此功能添加到我现有的计算器代码中?

这就是我目前使用Simpson规则定义要集成的函数的方法。

public virtual double funct(double x)
{
    return 2 / (1 + 4*(x * x));
}

当我从那里更改函数时,我的form1.cs [design]给出了正确的结果.......但是我希望能够从我的form.cs中选择不同的函数(任何集成函数) [设计]

1 个答案:

答案 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或表达式构建器来验证和解释提交的函数,这是一个完全不同的球赛。