Zio*_*ony 5 c# generics constructor multiple-inheritance
嗨,我正在尝试制作一个通用的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;
}
}
Run Code Online (Sandbox Code Playgroud)
它有一个配套界面
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);
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是继承以下两个:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
错误是:'Parser.Objects.TreeNode'不包含带0参数的构造函数
请帮忙!
您需要添加对基类的构造函数的调用.
而且,随后,您不需要在FHXTreeNode的构造函数中设置属性,因为它是在基类的构造函数中处理的.您的新构造函数应如下所示:
public FHXTreeNode(FHXTreeNode<T> parent, T data) : base(parent, data)
{
}
Run Code Online (Sandbox Code Playgroud)
您需要调用基类的构造函数.如果省略该:base(...)调用,则会调用基类的无参数构造函数.由于您的基类没有这样的构造函数,因此会出错.
public FHXTreeNode(FHXTreeNode<T> parent, T data)
:base(parent, data)
{
}
Run Code Online (Sandbox Code Playgroud)
调用参数化基类构造函数也会使字段初始化过时,因为它们已经在基类中分配.
在C#中,您无法继承构造函数.您在派生类中创建一个新的构造函数,该构造函数恰好与基类构造函数具有相同的签名.
您的界面也被破坏了:您无法public abstract在界面中声明方法.接口方法总是隐式公开的,并且永远不会有实现.因此,这些修饰符将是多余的,并且是非法的.
接下来你不能override接口方法.您只能从基类覆盖virtual/ abstract方法.当你有一个与接口中的方法匹配的方法时,在接口方法中实现.
另一个错误是你在接口方法上重用了type参数:void AddChild<T>(T child);是错误的.此语法用于在方法上引入类型参数.但是您想要使用包含类型的type参数.所以你应该写AddChild(T child);.
还有一些风格问题:接口名称应该以前缀为前缀I.而且我会protected尽可能地避开田地.