C# 泛型继承

C# 泛型继承,c#,generics,inheritance,tree,C#,Generics,Inheritance,Tree,我已经创建了一个通用节点类,它将用于构建树对象。我想在另一个类中继承这个类的属性。job类表示包含在作业链树中的SQL作业。下面的代码给了我一个错误,我不知道为什么 public class Node<T> { public int id { get; set; } public Node<T> parent { get; set; } public List<Node<T>> Children = new List<

我已经创建了一个通用节点类,它将用于构建树对象。我想在另一个类中继承这个类的属性。job类表示包含在作业链树中的SQL作业。下面的代码给了我一个错误,我不知道为什么

public class Node<T>
{
    public int id { get; set; }
    public Node<T> parent { get; set; }
    public List<Node<T>> Children = new List<Node<T>>();

    public bool isRoot
    {
        get { return parent == null; }
    }

    public static Node<T> createTree(List<Node<T>> nodes)
    {
        if (nodes.Count() == 0)
            return new Node<T>();
     //Build parent / Child relationships
    }
}

public class Job : Node<Job>
{
    public string name {get; set;}

    public Job(String name)
    {
        this.name = name;
    }
}


   List<Job> joblist = JobDict.Select(j => new Job(j.Key)).ToList();
   Node<Job>.createTree(joblist);
我无法使用作业列表调用createTree。我意识到将其从List更改为List>是可行的,但为什么我不能执行前者?我想,因为我继承了node类,所以一个作业列表实际上相当于一个节点列表。如果这是一个非常基本的问题,我很抱歉,但我只是从泛型和继承开始,很难完全理解它

我意识到把它从一个列表改成另一个列表很有效 但是为什么我不能做前者呢

因为即使作业继承节点,列表也不会继承列表。换句话说,A继承B并不意味着List继承List

您可能需要首先将每个作业对象强制转换为节点:

问题在于列表和列表不是同一变体

如果您使用的是.NET4,您可以这样做

Node<Job>.createTree((IEnumerable<Node<Job>>)joblist);
或者,您可以修改CreateTree方法定义,如下所示

public static Node<T> createTree(IList  nodes)
{
    if (nodes.Count == 0)
    return new Node<T>();       

    //Build parent / Child relationships
} 

这不是对这个问题的直接回答,但它可能会给您一些如何使代码更简单的想法

保持代码简单通常是个好主意。您可以创建的最简单的树结构如下:

public class Tree<T> : List<Tree<T>> { }
在您的情况下,您可以将其稍微扩展为:

public class Node<T> : List<Node<T>>
{
    public int id { get; set; }
    public Node<T> parent { get; set; }

    public bool isRoot
    {
        get { return parent == null; }
    }
}

实际上,您可以免费获得所有子属性。

我可能无法正确理解您的问题。createTree的方法签名表示参数的类型必须是List,而不是List。因此,调用Node.createTreenew列表会使签名失败,因此您应该会遇到编译器错误;但是,Node.createTreenew列表满足签名,因此可以工作。无论如何,这可能不是你要问的。请你澄清一下你的问题好吗?这实际上是我想问的问题的答案。job.Parent=新JobParent;工作,但工作。儿童=新列表;没有。我将如何修改我的类定义以允许这种语法,或者更具体地说,允许将作业列表作为节点列表处理而不显式强制转换它们?我不确定您是否同意,但如何将其模板化:public static Node createTreeList nodes where U:Node{if nodes.Count==0 return new Node;//etc..}调用它将是:createTreejobs;顺便说一句,如果这是我们要找的,请接受这个答案:
public class Node<T> : List<Node<T>>
{
    public int id { get; set; }
    public Node<T> parent { get; set; }

    public bool isRoot
    {
        get { return parent == null; }
    }
}