gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:04:35 25 4
gpt4 key购买 nike

目前我正在做一项作业,我必须创建一个用 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 和任何其他类型的图表 - 例如稍后的 BarGraph - 即使类型参数不同。

最佳答案

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

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# 在接口(interface)和委托(delegate)上具有协变 和逆变。我建议您查看以下资源:

关于c# - 泛型通配符或类似的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36420404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com