使用system.func时将类型转换为接口

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

这里很新,对于 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 接口即可。我怎样才能做到这一点?

c# interface delegates
1个回答
0
投票

感谢所有帮助我找到解决方案的贡献者。 我就在这里分享一下。 这个想法是让 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());
    }
}

希望有一天它能帮助别人!

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