C# 泛型通配符或类似的东西

C# 泛型通配符或类似的东西,c#,generics,C#,Generics,目前正在执行一项任务,其中我必须创建一个用C#实现的自定义用户控件。我主要有java背景,所以我不知道我想在C#中做的事情是否可行-如果不行,请有人给我提供一个链接或其他方法,我可以在C#中完成同样的事情 公共抽象类图 其中T:Configuration.GraphConfiguration 其中U:Representations.GraphRepresentative { 公开摘要作废图(图g); } 公共类线条图:图形{ 公共空间绘制(图g){ } } //“Graph”无效,因为未指定类

目前正在执行一项任务,其中我必须创建一个用C#实现的自定义用户控件。我主要有java背景,所以我不知道我想在C#中做的事情是否可行-如果不行,请有人给我提供一个链接或其他方法,我可以在C#中完成同样的事情

公共抽象类图
其中T:Configuration.GraphConfiguration
其中U:Representations.GraphRepresentative
{
公开摘要作废图(图g);
}
公共类线条图:图形{
公共空间绘制(图g){
} 
}
//“Graph”无效,因为未指定类型参数。。
//然而,我不能提供它们,因为我直到运行时才知道是什么
//是的。在java中,只有“Graph”或Graph是有效的,我需要
//类似的东西。
公共类MyCustomControl:UserControl{
图电流图;
覆盖OnPaint(PaintEventArgs e){
当前图形绘制(如图形);
}
}

因此,基本上我需要一种类型或某种方式来保存线形图和任何其他类型的图,例如稍后的条形图,即使类型参数不相同。

因为代码表明,绘制整个图形不需要这些泛型类型,我发现您可以轻松解决定义非通用接口的问题:

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);
}
关于泛型,通配符。。。 至少在.NET中,引入泛型是为了尽可能地强制执行强类型,并避免大量损害性能和可维护性的强制转换。这不是可以忽略的事情

顺便说一句,C#在接口和委托上有协方差和逆变。我建议您查看以下资源:


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

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);
}
关于泛型,通配符。。。 至少在.NET中,引入泛型是为了尽可能地强制执行强类型,并避免大量损害性能和可维护性的强制转换。这不是可以忽略的事情

顺便说一句,C#在接口和委托上有协方差和逆变。我建议您查看以下资源:


在Java中,泛型是语法糖。在C#中,它们是一个编译时问题:DYep,泛型在C#中的工作方式完全不同。在C#中,没有类
图形
,而在Java中,只有类
图形
。。在我完成类的实现之后。我有没有别的选择?有点困惑,为什么它不只是推断出一个图形,因为这对我来说是有意义的。@Eladian,是的,接口。检查我的答案!在Java中,泛型是语法糖。在C#中,它们是一个编译时问题:DYep,泛型在C#中的工作方式完全不同。在C#中,没有类
图形
,而在Java中,只有类
图形
。。在我完成类的实现之后。我有没有别的选择?有点困惑,为什么它不只是推断出一个图形,因为这对我来说是有意义的。@Eladian,是的,接口。检查我的答案!我必须提高我的打字技能:)你更快:)@diligentkeypress我打字不快。键盘打字是因为我的脑子里有一些想法!我都没想到。可能是因为我以前从来没有遇到过必须这样做!这是有道理的,谢谢!我必须提高我的打字技能:)你更快:)@diligentkeypress我打字不快。键盘打字是因为我的脑子里有一些想法!我都没想到。可能是因为我以前从来没有遇到过必须这样做!这是有道理的,谢谢!