作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现了一个问题 here这几乎回答了我的问题,但我仍然没有完全理解。
尝试编写树数据结构,我这样做了:
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
类(class)。只有一个 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];
A Tree<string>.TreeNode
是与 Tree<int>.TreeNode
不同的 类型.
关于c# - 内部类泛型类型与外部类型相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38722514/
我是一名优秀的程序员,十分优秀!