【问题标题】:in c# for type safe tree implementation (typesafe node)在 c# 中用于类型安全树的实现(类型安全节点)
【发布时间】:2016-10-17 00:21:10
【问题描述】:

我正在寻找 /tring 以在 C# 中实现类型安全的树实现。

如何在不使用接口(强制在所有地方重新实现树功能)和不使用强制类型转换的情况下实现类型安全树?

我有使用树作为公共基类的想法,但是类型安全性就消失了。我目前的方法是使用泛型。但是我缺少一些转换回基本类型的方法。

以下是一个简化/无效的示例。 这个想法是返回的节点支持树函数,同时它们也支持它们的基类型行为。 我可以在没有 Node 的情况下使用下面的类并从 Node 继承,但是一方面我失去了类型安全性,并且还遇到了继承问题,因为 Node 已经有父类。

我也玩过类扩展,但我没有任何接近可能的解决方案。

我想我需要一点关于如何继续的小提示。提前谢谢你。

public class Node<T>  // .
{
    public Node<T> parent;
    public List<Node<T>> children;

    protected Node()
    {
        children = new List<Node<T>>();
        parent = null;
    }
    protected Node(Node<T> parent)
        : this()
    {

        this.parent = parent;
        parent.addChildren(this);
    }


    protected void addChildren(Node<T> child)
    {
        children.Add(child);
    }
    public Node<T> getRoot() // returns root node
    public List<Node<T>> flatten()  // return 1d-list of all nodes.

}

【问题讨论】:

  • 树中每个节点的 T 类型可以不同吗?还是在整棵树中总是一样的?
  • 否(仅限子类)。但我想对不同的 T 使用相同的树实现。

标签: c# tree nodes type-safety


【解决方案1】:

这是一个类型安全的树实现:

public class Tree<T> : List<Tree<T>>
{
    public T Value { get; set; }
}

是的,就是这样。很简单。

当然,您可以添加一个或两个构造函数,并将Value 属性设为只读,以使其对OOP 更加友好。您可以轻松添加Parent 属性。

【讨论】:

  • 最好的想法是那些显而易见的。 :-)
【解决方案2】:

我有使用树作为通用基类的想法,但是类型安全性就消失了。我目前的方法是使用泛型。但我缺少一些转换回基本类型的方法。

然后将泛型类型限制为您的基本类型:

public class Node<T> where T: BaseType { ... }

现在您可以创建Node&lt;MyDerivedType&gt; 类型的任何树,只要MyDerivedType 派生自BaseType

另一方面,我会考虑在您的实现中修改以下内容:

  1. Children 应该是一个属性,除非它是只读的,否则不要公开一个字段。此外,您不应将其公开为List;这将允许任何人直接添加或删除节点,这可能会违反您的实现中假设的不变量。改为返回IEnumerable&lt;T&gt;

    private readonly List<T> children;
    public IEnumerable<T> Children => children.Select(c => c);
    

    您可以直接返回children,因为它可以隐式转换为IEnumerable&lt;T&gt;;问题是任何人都可以简单地将其转换回List&lt;T&gt; 并对其进行修改。投射它可以保护您免受这种转化。

  2. Flatten 也是如此(顺便说一句,第一个 f 应该大写)。考虑也返回一个IEnumerable&lt;T&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2020-04-29
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    相关资源
    最近更新 更多