目前正在进行一项任务,我必须创建一个用C#实现的自定义用户控件。我主要有一个java背景,所以我不知道我在C#中做的事情是否可行 - 如果不是,有人可以给我一个链接或替代方式我可以在C#中完成同样的事情。
public abstract class Graph<T,U>
where T : Configuration.GraphConfiguration
where U : Representatives.GraphRepresentative
{
public abstract void Draw(Graphics g);
}
public class LineGraph: Graph<LineGraphConfiguration,LineGraphRepresentative>{
public void draw(Graphics g){
}
}
//"Graph" is not valid since the type params <T,U> are not specified..
//However, I cannot supply them since I don't know until runtime what
//they are. In java just "Graph" or Graph<?,?> would be valid and I need
//something similar.
public class MyCustomControl: UserControl{
Graph currentGraph;
override OnPaint(PaintEventArgs e){
currentGraph.Draw(e.Graphics);
}
}
所以基本上我需要一种类型或某种方式来同时保存LineGraph和任何其他类型的Graph - 例如稍后的BarGraph - 即使类型参数不相同。
由于您的代码显示您不需要这些泛型类型来绘制整个图形,我看到您可以轻松解决定义非泛型接口的问题:
public interface IGraph
{
void Draw(Graphics g);
}
...而你的抽象类可以实现它:
public abstract class Graph<T,U> : IGraph
where T : Configuration.GraphConfiguration
where U : Representatives.GraphRepresentative
{
public abstract void Draw(Graphics g);
}
...这意味着您现在可以使用IGraph
键入您的类字段:
public class MyCustomControl: UserControl{
IGraph currentGraph;
override OnPaint(PaintEventArgs e){
currentGraph.Draw(e.Graphics);
}
}
至少在.NET中,引入了泛型来尽可能强制执行强类型操作,并避免大量的演员表损害性能和可维护性。这不是可以绕过的东西。
顺便说一句,C#在接口和代理方面具有协方差和逆变。我建议你看一下以下资源: