继承的泛型构造函数C#

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参数的构造函数

请帮忙!

Jus*_*ner 9

您需要添加对基类的构造函数的调用.

而且,随后,您不需要在FHXTreeNode的构造函数中设置属性,因为它是在基类的构造函数中处理的.您的新构造函数应如下所示:

public FHXTreeNode(FHXTreeNode<T> parent, T data) : base(parent, data)
{
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*aos 5

您需要调用基类的构造函数.如果省略该: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尽可能地避开田地.

  • 您确定要在方法中引入类型参数而不是在接口类型中引入类型参数吗?使这些方法通用是没有意义的. (2认同)