我目前正在研究一种在 C# 中实现侵入式树结构的简单方法。由于我主要是一名 C++ 程序员,所以我立即想使用 CRTP。这是我的代码:
public class TreeNode<T> where T : TreeNode<T>
{
public void AddChild(T a_node)
{
a_node.SetParent((T)this); // This is the part I hate
}
void SetParent(T a_parent)
{
m_parent = a_parent;
}
T m_parent;
}
这行得通但是...我不明白为什么我在调用 a_node.SetParent((T)this) 时必须强制转换,因为我使用的是通用类型限制... C# cast 有成本,我不想在每个侵入式集合实现中传播这个 cast...
最佳答案
这至少是 TreeNode 类型。它可以是派生的,也可以是 TreeNode。 SetParent 需要一个 T。但是 T 可以是与它不同的类型。我们知道 this 和 T 都派生自 TreeNode 但它们可以是不同的类型。
例子:
class A : TreeNode<A> { }
new TreeNode<A>() //'this' is of type 'TreeNode<A>' but required is type 'A'
关于C#——侵入式树结构,使用CRTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9369664/