大家好。我正在使用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 });
}
上面定义了一个函数,它取一个图表,一个系列,每次都传递一对点。
答案 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设计中有用的概念。祝你好运。