【发布时间】:2021-02-26 00:47:33
【问题描述】:
为了解决这个问题,我目前正在编写一个生成迷宫的方法。
这是所涉及类的(简化)版本:
public interface IAlgorithm<out MazeType> where MazeType : Maze
{
MazeType GoGenerate();
}
public class AlgorithmBacktrack : IAlgorithm<Maze>
{
public Maze GoGenerate()
{
//Do things
return new Maze();
}
}
public class Maze
{
}
public class MazeWithPath : Maze
{
}
我现在想做的是创建助手来调用这个算法:
public class MazeGenerator
{
public static MAZETYPEGENERIC Generate<AlgorithmType>()
where AlgorithmType : IAlgorithm<MAZETYPEGENERIC>, new()
{
var alg = new AlgorithmType();
return alg.GoGenerate();
}
}
我无法开始工作的是 MAZETYPEGENERIC。从理论上讲,C# 可以知道我放在那里的任何 IAlgorithm 接口实现都会配置 MAZETYPEGENERIC。但是 C# 仍然希望我将其作为通用参数添加到方法中。例如:
public static MAZETYPEGENERIC Generate<AlgorithmType, MAZETYPEGENERIC>()
where AlgorithmType : IAlgorithm<MAZETYPEGENERIC>, new()
...
然而,这意味着调用此调用也需要此参数。尽管理论上可以从 AlgorithmType 推断出来。
//Ideal way to call this method:
Maze m = MazeGenerator.Generate<AlgorithmBacktrack>();
//Actual way to call this after adding the additional generic parameter:
Maze m = MazeGenerator.Generate<AlgorithmBacktrack, Maze>();
如果有人对如何完成选项 1(执行此操作的理想方式)有想法,我很乐意看到/听到。
【问题讨论】:
-
两个泛型参数是不可避免的。除非返回预定义类型就足够了,例如
IMaze(public static IMaze Generate<AlgorithmType>()...)