C#——侵入式树结构,使用CRTP

标签 c# tree crtp

我目前正在研究一种在 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/

相关文章:

c# - 如何在 .net Core 中使用 Microsoft Reporting Services

c# phone 8.1 更改 jpeg 质量

c# - ASP.NET:如何允许用户对 gridview 列进行重新排序?

python - 使用 python 从 csv 文件构建树

c++ - 使用 C++ 将子类与父类链接的方法

c# - if else语句的写法

javascript - 为什么我需要一个列表折叠来实际解构具有这种树变态的树?

algorithm - 通过添加或乘以节点找到树可以生成的所有数字

c# - 如何在 C# 中编写一个很好的奇特的重复模板模式 (CRTP)

C++ 错误枚举和 CRTP