Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
继承泛型构造函数C#_C#_Generics_Constructor_Multiple Inheritance - Fatal编程技术网

继承泛型构造函数C#

继承泛型构造函数C#,c#,generics,constructor,multiple-inheritance,C#,Generics,Constructor,Multiple Inheritance,嗨,我在试着做一个普通的树状体。下面是抽象泛型类 public abstract class TreeNode<T> { protected List<TreeNode<T>> _childNodes = new List<TreeNode<T>>(); protected TreeNode<T> ParentNode; public T ObjectData { get; set; }

嗨,我在试着做一个普通的树状体。下面是抽象泛型类

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;
    }    
}
公共抽象类树节点
{
受保护列表_childNodes=新列表();
受保护的树节点父节点;
公共T对象数据{get;set;}
公共树节点(树节点父节点,T数据)
{
ParentNode=父节点;
ObjectData=数据;
}    
}
它有一个配套接口

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);
}
接口树操作
{
//将子节点添加到树节点
公开摘要无效儿童(T儿童);
//执行N-树搜索
公共摘要TreeNode SeachChild(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;
    }

}
公共类FHXTreeNode:TreeNode,TreeNodeOperations其中T:ParserObject
{
公共FHXTreeNode(FHXTreeNode父节点,T数据)--->#**错误**#
{
ParentNode=父节点;
ObjectData=数据;
}
//将子节点添加到树节点
公共覆盖FHXTreeNode AddChild(T childData)
{
FHXTreeNode子节点=新FHXTreeNode(此为childData);
//_添加(子节点);
返回儿童;
}
}
错误是:'Parser.Objects.TreeNode'不包含接受0个参数的构造函数


请帮忙

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

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

public FHXTreeNode(FHXTreeNode<T> parent, T data) : base(parent, data)
{
}
interface TreeNodeOperations<T>
{
    //Adds child to tree node
    void AddChild(T child);
    //Performs N-Tree search
    TreeNode<T> SeachChild(T child);
}
公共FHXTreeNode(FHXTreeNode父节点,T数据):基(父节点,数据)
{
}

您必须从FHXTreeNode构造函数调用基类构造函数:

public FHXTreeNode(FHXTreeNode<T> parent, T data)
    : base(parent, data)
{
    ParentNode = parent;
    ObjectData = data;
}
公共FHXTreeNode(FHXTreeNode父节点,T数据)
:base(父项、数据)
{
ParentNode=父节点;
ObjectData=数据;
}

另外,按照惯例,接口在.NET中以大写的I开头,因此TreeNodeOperations应该是ITreeNodeOperations,您需要调用基类的构造函数。如果省略
:base(…)
调用,将调用基类的无参数构造函数。由于基类没有这样的构造函数,因此会出现错误

public FHXTreeNode(FHXTreeNode<T> parent, T data)
   :base(parent, data)
{
}
公共FHXTreeNode(FHXTreeNode父节点,T数据)
:base(父项、数据)
{
}
调用参数化基类构造函数也会使字段初始化过时,因为它们已经在基类中分配给了

在C#中,不能继承构造函数。您在派生类中创建了一个新的构造函数,该构造函数恰好与基类构造函数具有相同的签名


你的接口也坏了:你不能在接口中将方法声明为
public abstract
。接口方法总是隐式公开的,从来没有实现。所以这些修饰符是多余的,是非法的


接下来,您不能覆盖接口方法。只能重写基类中的
virtual
/
abstract
方法。当您有一个与接口中的方法匹配的方法时,in将实现该接口方法


另一个错误是重用接口方法上的type参数:
void AddChild(T child)是错误的。此语法用于在方法上引入类型参数。但是您希望使用包含类型中的类型参数。所以你应该写
AddChild(T child)



还有一些风格问题:接口名称的前缀应该是
I
。在可能的情况下,我会避免使用受保护的字段。

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

public FHXTreeNode(FHXTreeNode<T> parent, T data) : base(parent, data)
{
}
interface TreeNodeOperations<T>
{
    //Adds child to tree node
    void AddChild(T child);
    //Performs N-Tree search
    TreeNode<T> SeachChild(T child);
}
…如果不调用FHXTreeNode的基本构造函数,则无法创建FHXTreeNode的实例,如下所示:

public TreeNode() { }
public FHXTreeNode(FHXTreeNode<T> parent, T data) : base(parent, data) { }
公共FHXTreeNode(FHXTreeNode父节点,T数据):基(父节点,数据){}

感谢您的输入,实际上我想做的是在方法中引入类型参数,所以我应该去掉接口名称中的。我非常感谢您的建议。您确定要在方法中而不是在接口类型中引入类型参数吗?让这些方法泛化没有什么意义。是的,因为这些接口是因为我意识到,例如,并不是所有的树都以相同的方式添加子元素。如果我把它放在抽象基类中,我将不得不重载addChild方法,结果代码将比现在更糟糕。由于并非所有树都以相同的方式添加和搜索子树,因此我正在考虑采用一种策略模式来实现这些树操作。非常感谢。这是一个很大的帮助!