您好我正在尝试制作通用的treenode。这是抽象泛型类
public abstract class TreeNode<T>
{
protected List<TreeNode<T>> _childNodes = new List<TreeNode<T>>();
protected TreeNode<T> ParentNode;
public T ObjectData { get; set; }
public TreeNode( TreeNode<T> parent, T data)
{
ParentNode = parent;
ObjectData = data;
}
}
它有一个配套界面
interface TreeNodeOperations<T>
{
//Adds child to tree node
public abstract void AddChild<T>(T child);
//Performs N-Tree search
public abstract TreeNode<T> SeachChild<T>(T child);
}
我要做的是从这两个方面继承:
public class FHXTreeNode<T>: TreeNode<T>, TreeNodeOperations<T> where T : ParserObject
{
public FHXTreeNode(FHXTreeNode<T> parent, T data) ---> # **ERROR** #
{
ParentNode = parent;
ObjectData = data;
}
//Adds child to tree node
public override FHXTreeNode<T> AddChild<ParserObject>(T childData)
{
FHXTreeNode<T> child = new FHXTreeNode<T>(this, childData);
//_childNodes.Add(child);
return child;
}
}
错误是: 'Parser.Objects.TreeNode'不包含带0参数的构造函数
帮帮忙!
答案 0 :(得分:9)
您需要添加对基类'构造函数的调用。
然后,您不需要在FHXTreeNode的构造函数中设置属性,因为它是在基类的构造函数中处理的。您的新构造函数应如下所示:
public FHXTreeNode(FHXTreeNode<T> parent, T data) : base(parent, data)
{
}
答案 1 :(得分:5)
您需要调用基类的构造函数。如果省略:base(...)
调用,则会调用基类的无参数构造函数。由于您的基类没有这样的构造函数,因此会出错。
public FHXTreeNode(FHXTreeNode<T> parent, T data)
:base(parent, data)
{
}
调用参数化基类构造函数也会使字段初始化过时,因为它们已经被分配到基类中。
在C#中,您无法继承构造函数。您在派生类中创建一个新的构造函数,该构造函数恰好与基类构造函数具有相同的签名。
您的界面也被破坏:您无法在界面中将方法声明为public abstract
。接口方法总是隐式公开的,并且永远不会有实现。因此,这些修饰符将是多余的,并且是非法的。
接下来你不能override
接口方法。您只能覆盖基类中的virtual
/ abstract
方法。当你有一个与接口中的方法匹配的方法时,在接口方法中实现。
另一个错误是您在接口方法上重用了type参数:void AddChild<T>(T child);
是错误的。此语法用于在方法上引入类型参数。但是您想要使用包含类型的type参数。所以你应该写AddChild(T child);
。
还有一些风格问题:接口名称应以I
为前缀。我会尽可能避免使用protected
字段。
答案 2 :(得分:3)
您必须从FHXTreeNode构造函数中调用基类构造函数:
public FHXTreeNode(FHXTreeNode<T> parent, T data)
: base(parent, data)
{
ParentNode = parent;
ObjectData = data;
}
此外,按照惯例,接口以.NET中的大写字母I开头,因此TreeNodeOperations应为ITreeNodeOperations
答案 3 :(得分:3)
首先,public
和abstract
在接口声明中不是有效的关键字。您的界面应如下所示:
interface TreeNodeOperations<T>
{
//Adds child to tree node
void AddChild(T child);
//Performs N-Tree search
TreeNode<T> SeachChild(T child);
}
要回答你的问题,因为TreeNode
没有定义像这样的无参数构造函数:
public TreeNode() { }
...然后在不调用基本构造函数的情况下无法创建FHXTreeNode的实例:
public FHXTreeNode(FHXTreeNode<T> parent, T data) : base(parent, data) { }