我发现了一个问题,这里是几乎回答我的问题,但我还是不完全了解。
尝试编写Tree数据结构,我这样做是:
public class Tree<T>
{
public TreeNode<T> root;
...
public class TreeNode<T>
{
List<TreeNode<T>> children;
T data;
public T Data { get { return data; } }
public TreeNode<T>(T data)
{
this.data = data;
children = new List<TreeNode<T>>();
}
...
}
}
而且,任何使用C#泛型的人显然都知道我收到了此编译器警告: Type parameter 'T' has the same name as the type parameter from outer type 'Tree<T>'
我的意图是创建一个内部类,该类将被迫使用与外部类相同的类型,但是我现在知道,添加类型参数实际上可以使内部类更加灵活。但是,就我而言,我希望的子类Tree<T>
能够使用TreeNode
,例如,如下所示:
public class IntTree : Tree<int>
{
...
private static IntTree fromNode(TreeNode<int> node)
{
IntTree t = new IntTree();
t.root = node;
return t;
}
}
(该方法允许子类ToString()
递归实现)
所以我的问题是,如果我删除参数化,像这样:
public class Tree<T>
{
public TreeNode root;
...
public class TreeNode
{
List<TreeNode> children;
T data;
public T Data { get { return data; } }
public TreeNode(T data)
{
this.data = data;
children = new List<TreeNode>();
}
...
}
}
创建TreeNode
s时,结果子类是否会被迫使用整数,因此永远无法破坏我的意图?
免责声明:是的,我知道我可能在这里做错了很多事情。我仍在学习C#,主要是Java和Lisp的背景知识,并带有一点普通的C语言。因此,欢迎提出建议和解释。
是的,它将被迫使用相同的类型。再看一下声明:
public class Tree<T>
{
public class TreeNode
{
private T Data;
}
}
因此,Data
实例化特定对象时将确定的类型Tree
:
var tree = new Tree<int>();
这样,的类型Data
被声明为int
和可以相同。
请注意,没有非泛型TreeNode
类。只有一种Tree<int>.TreeNode
类型:
Tree<int> intTree = new Tree<int>(); // add some nodes
Tree<int>.TreeNode intNode = intTree.Nodes[0]; // for example
Tree<string> stringTree = new Tree<int>(); // add some nodes
Tree<string>.TreeNode stringNode = stringTree.Nodes[0]; // for example
// ERROR: this won't compile as the types are incompatible
Tree<string>.TreeNode stringNode2 = intTree.Nodes[0];
阿Tree<string>.TreeNode
是一个不同类型的比Tree<int>.TreeNode
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句