gpt4 book ai didi

c# - 带有泛型的嵌套类

转载 作者:行者123 更新时间:2023-11-30 16:29:44 24 4
gpt4 key购买 nike

我目前正在进行的项目要求我创建一个树数据结构。下面是我如何尝试实现此功能的示例。我决定创建一个子节点集合作为嵌套类,因为它允许我在它的 Add() 方法中设置 Nodes parent,同时保持父 setter 私有(private),这样从 Node 派生的类或同一程序集中的其他类不能直接访问它。

class Node<T> where T : Node<T>
{
private T mParent;
private ChildNodeCollection<T> mChildren;

public T Parent
{
get{return this.InnerParent;}
}

private T InnerParent
{
get{return this.mParent;}
set {this.mParent = value;}
}

public Node()
{
this.mChildren = new ChildNodeCollection<T>(this);
}

class ChildNodeCollection<U> where U : T
{
private U mParent;

public U CollectionParent
{
get{return this.mParent;}
}

public ChildNodeCollection(U parent)
{
this.mParent = parent;
}


public void Add(U item)
{
item.InnerParent = this.CollectionParent;

...
}

}
}

虽然这段代码无法编译。它提示 Node 构造函数中的 this.mChildren = new ChildNodeCollection(this) 行。它抛出这两个错误。

Error   35  The best overloaded method match for Node<T>.ChildNodeColllection<T>.ChildNodeColllection(T)' has some invalid arguments

Error 36 Argument '1': cannot convert from Node<T> to T

我猜无法确定 T 是节点,即使我在类定义中如此指定。我很好奇是否有人知道如何以不同的方式完成此操作,从而允许我在将节点添加到集合时设置 Node 的父级,而不会使用内部访问修饰符过多地暴露 Node 的 Parent 属性。

最佳答案

在任何情况下,在使用构造函数创建泛型对象时都需要显式指定类型参数,因此需要这样写:

this.mChildren = new ChildNodeCollection<T>(this);

这行不通,因为 this 的类型是Node<T>而不是 T (这是构造函数所需要的)。我认为修复它的最简单方法是将父级存储为 Node<T>而不是使用通用参数。

代码的相关部分如下所示:

public Node() {
this.mChildren = new ChildNodeCollection(this);
}

class ChildNodeCollection {
private Node<T> mParent;

public ChildNodeCollection(Node<T> parent) {
this.mParent = parent;
}
}

我猜您最初的目标(使用 T : Node<T> 约束)是使用继承来定义更具体的节点类型。然后你想检索静态类型为 T 的 child (或 parent ) (即您的特定节点类型)。我可能是错的,但我严重怀疑这可以用 .NET 泛型来表达。

我觉得用起来方便很多Node<T>作为表示包含类型值 T 的节点的类型而不是使用继承。

关于c# - 带有泛型的嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6143933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com