泛型通配符或类似的东西

问题描述 投票:1回答:1

目前正在进行一项任务,我必须创建一个用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 - 即使类型参数不相同。

c# generics
1个回答
8
投票

由于您的代码显示您不需要这些泛型类型来绘制整个图形,我看到您可以轻松解决定义非泛型接口的问题:

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#在接口和代理方面具有协方差和逆变。我建议你看一下以下资源:

© www.soinside.com 2019 - 2024. All rights reserved.