这里很新,对于 C# 来说也很新。 这是我的问题。 我有一个使用 func delegate 的通用类
public class Grid<TGridObject>
{
private TGridObject[,] mat;
public Grid(int width, int height, System.Func<Grid<TGridObject>, int, int, TGridObject> createObject)
{
this.mat= new TGridObject[width, height];
for (int i = 0; i < this.width; ++i)
{
for (int j = 0; j < this.height; ++j)
{
this.mat[i, j] = createObject(this, i, j);
}
}
}
}
我还定义了一个非常简单的类,我想由上面的通用类使用:
public class PathNode
{
public Grid<PathNode> Grid { get; set; }
public int X { get; set; }
public int Y { get; set; }
public PathNode(Grid<PathNode> grid, int x, int y)
{
this.Grid = grid;
this.X = x;
this.Y = y;
}
//More methods after that
}
最后,我有一个使用前面两个类的类:
public class PathFinding
{
public Grid<PathNode> Grille { get ; set ;}
public PathFinding(int width, int height)
{
this.Grille = new Grid<PathNode>(width, height, (Grid<PathNode> g, int x, int y) => new PathNode(g, x, y));
}
//...
}
这工作得很好,我对此没有什么特别的问题。
现在我想要更多不同类型的网格对象,而不是 PathNode。 我想要一个 IPathNode 接口,它将成为所有类的基础。
定义接口进展顺利,但我现在不知道如何在 PathFinding 类定义中使用它。 我试过:
public class PathFinding
{
public Grid<IPathNode> Grille { get ; set ;}
public PathFinding(int width, int height)
{
this.Grille = new Grid<IPathNode>(width, height, (Grid<IPathNode> g, int x, int y) => new IPathNode(g, x, y));
}
//...
}
但是,当然,它会抛出错误:CS0144 Cannot create an instance of the Abstract Class or Interface 'IPathNode'
我被困住了。我怎样才能把它说对呢? 谢谢!
编辑:主要思想是在 PathFinding 类中提到它可以使用任何类型对象的 Grid,只要这些对象实现 IPathNode 接口即可。我怎样才能做到这一点?
感谢所有帮助我找到解决方案的贡献者。 我就在这里分享一下。 这个想法是让 PathFinding 类能够接受任何类型的对象,只要这些对象实现了 IPathNode 接口。 所以我决定让 PathFinding 类变得通用:
public class PathFinding<T> where T : IPathNode, new()
{
protected Grid<T> grille;
public Grid<T> Grille { get => this.grille; }
public PathFinding(int width, int height)
{
this.grille = new Grid<T>(width, height, (Grid<T> g, int x, int y) => new T());
}
}
希望有一天它能帮助别人!