gpt4 book ai didi

c# - 为现有类创建接口(interface)?

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:35 26 4
gpt4 key购买 nike

我使用一个 Model 在屏幕上绘制一些系列。您可以创建类似 LineSeriesCurveSeries 的系列,并将它们添加到模型中:Model.Series.Add(myLineSeries);。该系列有一个属性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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com