我使用一个模型
在屏幕上绘制一些系列。您可以创建诸如 LineSeries
或 CurveSeries
之类的系列,并将它们添加到模型中:Model.Series.Add(myLineSeries);
。 Series 有一个属性 Points
,其中保存了所有点,您可以轻松添加一些点:myLineSeries.Points.Add(...);
。 Model
采用从基类 Series
继承的所有系列。
但是当我将其添加到模型并想稍后添加一些点时,我必须将其转换回来:
//Model.Series[0].Points does not exists. I have to cast them...
var lineSeries = (Model.Series[0] as LineSeries);
if(lineSeries != null)
lineSeries.Points.Add(...);
var curveSeries = (Model.Series[0] as CurveSeries);
//Same code for CurveSeries
//Same code for other series types...
所以我必须一遍又一遍地执行相同的代码。如果您可以访问源代码,您可以说:让我们创建一个“点接口(interface)”或一个基类,其中所有属性都具有点。系列只需继承基类或接口(interface)即可。现在你可以说:
var Series = (Model.Series[0] as IPointSeries);
//Code only one time :)
但现在我无法访问系列和模型的源代码。我无法更改模型、系列或抽象系列基类实现。
是否有一种通用方法可以在不更改模型或系列源代码的情况下执行此操作?喜欢为现有系列创建一个界面来以相同的方式访问它们吗?
最佳答案
您可以编写一组包装类,这样至少您不必多次编写了解多种基础类型的所有代码。
例如:
public class PointSeries
{
public List<Point> Points { get { return new List<Point>(); } }
}
public class CurveSeries
{
public List<Point> Points { get { return new List<Point>(); } }
}
public interface ISeriesWrapper
{
List<Point> Points { get; }
}
public class PointSeriesWrapper : ISeriesWrapper
{
public PointSeriesWrapper(PointSeries series)
{
_Series = series;
}
private PointSeries _Series;
public List<Point> Points { get { return _Series.Points; } }
}
public class CurveSeriesWrapper : ISeriesWrapper
{
public CurveSeriesWrapper(CurveSeries series)
{
_Series = series;
}
private CurveSeries _Series;
public List<Point> Points { get { return _Series.Points; } }
}
public static class SeriesWrapper
{
public static ISeriesWrapper Create(object series)
{
var pointSeries = series as PointSeries;
if (pointSeries != null)
return new PointSeriesWrapper(pointSeries);
var curveSeries = series as CurveSeries;
if (curveSeries != null)
return new CurveSeriesWrapper(curveSeries);
throw new NotSupportedException();
}
}
使用示例:
var pointSeries = SeriesWrapper.Create(Model.Series[0]);
lineSeries.Points.AddRange(pointSeries.Points);
关于c# - 为现有类创建接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25182088/