将方法添加到现有图表和系列类c#

时间:2014-07-02 10:52:13

标签: c# class charts delegates wrapper

enter image description here

大家好。我正在使用c#的windows形式开发一个绘图库,我想问一下如何在不切断它们之间连接的情况下,如何独立地将自己的方法添加到图表和系列等类中?

不要担心绳索,它只是我认为物理上代表图表和系列之间连接的东西,因为系列在图表下面。

我尝试使用继承,并添加新方法但后来我意识到它不会起作用,因为当你用egpublic类Mychart:Chart替换Chart时,Mychart不会与chart.Series通信。从图中可以看出,从Chart继承的对象与Series没有任何关系(即它们之间没有连接),这是我在项目中遇到的巨大问题的简化版本。我非常感谢任何帮助或尝试。

澄清我的意思是没有联系:

this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart();

你可以看到chart1是由Chart类生成的吗?

确定现在继续使用Mychart替换图表(使用新方法)

this.chart2 = new System.Windows.Forms.DataVisualization.Charting.Mychart();

但是当你尝试从Mychart生成系列时会出现问题。

System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();

你不能再为系列做继承了,因为现在你可以看到Series在Chart下不在Mychart下面,它们根本就没有连接

System.Windows.Forms.DataVisualization.Mychart.NewSeries series2 = new System.Windows.Forms.DataVisualization.Mychart.NewSeries();

新系列并不存在< - 最后一段代码我故意错误地向你展示继承的错误。

在一天结束时,我可以调用我的功能,所以你知道为什么连接(绳索)非常重要。

        private delegate int PlotXYDelegate(double x, double y); // define a function pointer 

        private void PlotXYAppend(Chart chart, Series dataSeries, double x, double y)
        {
            chart.Invoke(new PlotXYDelegate(dataSeries.Points.AddXY), new Object[] { x, y });
        } 

上面定义了一个函数,它取一个图表,一个系列,每次都传递一对点。

1 个答案:

答案 0 :(得分:0)

关于继承:

您正在使用Chart课程。

它具有Chart.Series类型的SeriesCollection属性。

此集合的方法Add接受Series个实例。但它并不意味着它只接受Series实例 - 它也会接受从Series类派生的任何内容。

因此,例如,您已使用自定义方法创建了自己的Chart和Series继承者:

using System.Windows.Forms.DataVisualization.Charting;
...

public class MyChart: Chart
{
    public void MyChartMethod() { }
}

public class MySeries : Series
{
    public MySeries(String name) : base(name)
    {

    }

    public void MySeriesMethod() { }
}

然后您可以像使用经典的Chart和Series类一样使用它们:

    // Classic chart
    Chart chart = new Chart();

    chart.Series.Add(new Series("Classic series instance for Chart"));
    chart.Series.Add(new MySeries("My series instance for Chart"));

    this.Controls.Add(chart);

    // MyChart
    MyChart myChart = new MyChart();

    chart.Series.Add(new Series("Classic series instance for MyChart"));
    chart.Series.Add(new MySeries("My series instance for MyChart"));

    this.Controls.Add(myChart );
    ...
    myChart.MyChartMethod()

您遇到的唯一问题是SeriesCollection将其Series存储为Series引用,因此在您的方法中,您必须使用您使用的Series:

public class MyChart: Chart
{
    public void MyMethod() 
    {
        MySeries mySeries = (MySeries)this.Series[0];
        mySeries.MySeriesMethod();
    }
}

这不是最佳解决方案,如果您决定混合MySeries和原始系列,可能会带来一些问题。

关于WRAPPERS:

包装并不意味着继承。当继承不是一个选项时使用它们 - http://en.wikipedia.org/wiki/Decorator_pattern。通常它是这样的:

public class Original
{
    public void DoOriginal() { }
}

public class OriginalWrapper
{
    private Original original;
    public OriginalWrapper(Original original)
    {
        this.original = original;
    }

    public void DoOriginal() { original.DoOriginal();}

    public void DoOriginalWrapper() { }
}

OriginalWrapper将能够完成原始的所有功能+新功能DoOriginalWrapper()。但它并非继承自Original,因此您无法使用原始实例代替:

public class ConsumerOfOriginal
{
    public void ConsumeOriginal(Original original);
}

Original original = new Original();
OriginalWrapper originalWrapper = new OriginalWrapper(original);

Consumer consumer = new ConsumerOfOriginal();

consumer.ConsumeOriginal(original); // Compiles and works
consumer.ConsumeOriginal(originalWrapper); // Fails to compile

要解决此问题,您必须打开包装的实例或使用接口作为方法的参数。

解决您的问题:

我不知道你的具体情况,所以我不能推荐你对作文的继承(包装),但我希望我的帖子能为你清除至少一些东西。

P.S。:我建议您阅读:

http://www.codeproject.com/Articles/22769/Introduction-to-Object-Oriented-Programming-Concep
http://www.codeproject.com/Articles/618/OOP-and-UML

它们可能有点过于复杂,并且包含许多与现在无关的信息,但最终它们至少会概述并显示许多在编程和OOP设计中有用的概念。祝你好运。