В C# есть ли способ использовать «или» во входном аргументе метода? - PullRequest
1 голос
/ 09 марта 2020

В 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;
}

Возможно ли объединить это в один метод, который принимает LineSeries или ScatterSeries? Причина для этого заключается в том, что я продублировал множество методов для размещения LineSeries и ScatterSeries.

После поиска в Google я наткнулся на дженерики, и, возможно, это способ сделать это. Но я застрял, потому что они оба не наследуют один и тот же класс, и заставляет меня думать, что он несовместим с Generics:

namespace OxyPlot.Series
{
public class ScatterSeries : ScatterSeries<ScatterPoint>
...
public class LineSeries : DataPointSeries

EDIT: Вот пример того, что я ' Я хотел бы работать без ошибок, если это возможно. Прямо сейчас я получаю эту ошибку: не могу преобразовать из «OxyPlot.Series.ScatterSeries» в «OxyPlot.Series.DataPointSeries» в ScaleXMin (scatter);

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);
}

1 Ответ

8 голосов
/ 09 марта 2020

Глядя на исходный код Oxyplot Я нашел два класса, о которых вы говорите, и их базовый класс DataPointSeries . В DataPointSeries я вижу свойство public IList<IDataPoint> Points, на которое вы ссылаетесь. Это делает это намного проще, поскольку вам нужно только изменить тип параметра (и возвращаемое значение) на это:

public double ScaleXMin(DataPointSeries series)
{
    return series.Points[0].X;
}

При этом используется полиморфизм , в основном LineSeries наследует от DataPointSeries и, как таковой, экземпляр LineSeries также является экземпляром DataPointSeries. Это означает, что мы можем неявно приводить данные к DataPointSeries, это позволяет нам делегировать вещи подклассам без необходимости их знать (это что-то совершенно фундаментальное для объектно-ориентированного программирования). Это также позволяет нам вызывать этот метод так:

LineSeries line = new LineSeries();
// Do things with the LineSeries

var x = ScaleXMin(line);
...