【问题标题】:Inheritance/Polymporphism for mathematical function calculators数学函数计算器的继承/多态
【发布时间】:2014-11-16 10:42:28
【问题描述】:

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

我的程序已经完成,但是我想让它更加动态,并在我的 form1.cs[design] 中添加一个额外的功能。我想使用继承和多态来扩展我的类以接受不同的集成功能。

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

这是我目前使用辛普森规则定义要集成的函数的方式。

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

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

【问题讨论】:

  • 如果您不显示任何相关代码,很难提供帮助...
  • 非常感谢您的回复,请参阅重新编辑的问题。
  • 很难说出你想要什么。 “我希望能够选择不同的功能”听起来像是一组(小)可供选择的功能。相应的 GUI 元素将是一个列表框。您可以使用下面建议的委托,它是一个花哨的函数指针,或者实际上是继承和多态,特别是如果您想在函数中附加更多特性和信息(IsMonotonic、ToString 等)。
  • @PeterSchneider 即使在需要向函数添加更多信息/功能的情况下,继承也不是,恕我直言,这个问题的解决方案。我会用围绕Func<double, double> 的包装类来解决这个问题,用所需的属性对其进行装饰。
  • @InBetween TMTOWTDI。只是经典的继承更灵活、更优雅地解决了问题,而在 OO 之前是用函数指针解决的(调用代码在编写调用者时是未知的)。

标签: c# inheritance polymorphism integration


【解决方案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);
}

现在,您可以通过在构造函数中注入 IFunctionIntegrator,轻松地将您的 Form 实现与集成逻辑分离。 总是尽量将你的 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 或表达式构建器来验证和解释提交的函数,这是一个完全不同的球赛。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    相关资源
    最近更新 更多