继承的泛型构造函数C#

时间:2012-02-08 15:15:28

标签: 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;
    }    
}

它有一个配套界面

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

帮帮忙!

4 个答案:

答案 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)

首先,publicabstract在接口声明中不是有效的关键字。您的界面应如下所示:

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) { }