Ted*_*Tea 1 c# methods oxyplot
在 C# 中,有没有办法在方法的输入参数中使用“或者”?例如,我有 ScaleXmin 和 ScaleXmin_scatter 方法,它们都返回输入的 Points 属性。
public double ScaleXmin(LineSeries lineSeries)
{
return lineSeries.Points[0].X;
}
public double ScaleXmin_scatter(ScatterSeries scatterSeries)
{
return scatterSeries.Points[0].X;
}
Run Code Online (Sandbox Code Playgroud)
是否可以将其组合成一种接受 LineSeries 或 ScatterSeries 的方法?这样做的原因是因为我复制了许多方法来适应 LineSeries 和 ScatterSeries。
在谷歌搜索之后,我偶然发现了泛型,也许这就是这样做的方法。但是我被卡住了,因为它们都没有继承同一个类,并且让我认为它与泛型不兼容:
namespace OxyPlot.Series
{
public class ScatterSeries : ScatterSeries<ScatterPoint>
...
public class LineSeries : DataPointSeries
Run Code Online (Sandbox Code Playgroud)
编辑: 如果可能,这是我希望无错误运行的示例。现在我收到此错误:无法在 ScaleXMin(scatter) 处从“OxyPlot.Series.ScatterSeries”转换为“OxyPlot.Series.DataPointSeries”;
using OxyPlot.Series;
LineSeries line = new LineSeries();
ScatterSeries scatter = new ScatterSeries();
public double ScaleXMin(DataPointSeries series)
{
return series.Points[0].X;
}
public void Test()
{
double x = ScaleXMin(line);
double y = ScaleXMin(scatter);
}
Run Code Online (Sandbox Code Playgroud)
查看Oxyplot的源代码,我发现您谈论的两个类,以及它们的基类DataPointSeries。在DataPointSeries我看到public IList<IDataPoint> Points您正在引用的属性。这使这变得更加容易,因为您只需要将参数类型(和返回值)更改为:
public double ScaleXMin(DataPointSeries series)
{
return series.Points[0].X;
}
Run Code Online (Sandbox Code Playgroud)
这使用了多态性,基本上,LineSeries 继承自 DataPointSeries,因此 LineSeries 的实例也是 DataPointSeries 的实例。这意味着我们可以隐式转换为 DataPointSeries,这允许我们将事情委托给子类而无需知道这些(这是面向对象编程的基础)。这也允许我们像这样调用这个方法:
LineSeries line = new LineSeries();
// Do things with the LineSeries
var x = ScaleXMin(line);
Run Code Online (Sandbox Code Playgroud)