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

标签 c# design-patterns

我使用一个模型在屏幕上绘制一些系列。您可以创建诸如 LineSeriesCurveSeries 之类的系列,并将它们添加到模型中: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/

相关文章:

design-patterns - 微服务架构 - 当订单无关紧要时通过服务传递消息

c# - 使用 LINQ to Entities 进行自然排序

即使在 Windows 重新启动后,C# AddFontResource 也无法正常工作

C# 无法将字符串转换为字节数组以达到所需的结果?

c# - 将 Table<T> 转换为某物

php - 注册表模式和注册对象的惰性实例化

c++ - 如何实现具有不同签名的虚函数?

c# - 我应该在哪里创建 MVP 中的数据投影? Presenter 还好吗?

java - android中的三角形

c# - 是否可以为不同的类型创建一个通用的抽象父类?