C# 泛型继承
我已经创建了一个通用节点类,它将用于构建树对象。我想在另一个类中继承这个类的属性。job类表示包含在作业链树中的SQL作业。下面的代码给了我一个错误,我不知道为什么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<
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。我意识到将其从ListNode<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; }
}
}