自定义编写的二进制树也应该有接口吗

本文关键字:也应该 接口 二进制 自定义 | 更新日期: 2023-09-27 18:29:38

MSDN上有一篇关于二进制树以及如何在此处创建自定义二进制树的优秀文章

问题

代码如下。它有点长,但我粘贴它只是为了参考。(只要看一眼就知道了)。

实际上,我的问题是,如果我实现了下面这样的自定义二进制树,我应该首先为每个Node, NodesList, BinaryTree, BinaryTreeNode(4个类)定义一个接口,以便以后进行单元测试,还是在这种情况下不需要它。我看到.net中的许多集合都实现了IEnumerable,我应该这样做吗?或者有什么理由不需要在这里这样做?

public class Node<T>
{
        // Private member-variables
        private T data;
        private NodeList<T> neighbors = null;
        public Node() {}
        public Node(T data) : this(data, null) {}
        public Node(T data, NodeList<T> neighbors)
        {
            this.data = data;
            this.neighbors = neighbors;
        }
        public T Value
        {
            get
            {
                return data;
            }
            set
            {
                data = value;
            }
        }
        protected NodeList<T> Neighbors
        {
            get
            {
                return neighbors;
            }
            set
            {
                neighbors = value;
            }
        }
    }
}

节点类

public class NodeList<T> : Collection<Node<T>>
{
    public NodeList() : base() { }
    public NodeList(int initialSize)
    {
        // Add the specified number of items
        for (int i = 0; i < initialSize; i++)
            base.Items.Add(default(Node<T>));
    }
    public Node<T> FindByValue(T value)
    {
        // search the list for the value
        foreach (Node<T> node in Items)
            if (node.Value.Equals(value))
                return node;
        // if we reached here, we didn't find a matching node
        return null;
    }
}

最后是

public class BinaryTreeNode<T> : Node<T>
{
    public BinaryTreeNode() : base() {}
    public BinaryTreeNode(T data) : base(data, null) {}
    public BinaryTreeNode(T data, BinaryTreeNode<T> left, BinaryTreeNode<T> right)
    {
        base.Value = data;
        NodeList<T> children = new NodeList<T>(2);
        children[0] = left;
        children[1] = right;
        base.Neighbors = children;
    }
    public BinaryTreeNode<T> Left
    {
        get
        {
            if (base.Neighbors == null)
                return null;
            else
                return (BinaryTreeNode<T>) base.Neighbors[0];
        }
        set
        {
            if (base.Neighbors == null)
                base.Neighbors = new NodeList<T>(2);
            base.Neighbors[0] = value;
        }
    }
    public BinaryTreeNode<T> Right
    {
        get
        {
            if (base.Neighbors == null)
                return null;
            else
                return (BinaryTreeNode<T>) base.Neighbors[1];
        }
        set
        {
            if (base.Neighbors == null)
                base.Neighbors = new NodeList<T>(2);
            base.Neighbors[1] = value;
        }
    }
}

public class BinaryTree<T>
{
   private BinaryTreeNode<T> root;
   public BinaryTree()
   {
      root = null;
   }
   public virtual void Clear()
   {
      root = null;
   }
   public BinaryTreeNode<T> Root
   {
      get
      {
         return root;
      }
      set
      {
         root = value;
      }
   }
}

自定义编写的二进制树也应该有接口吗

没有答案,太长,无法评论:

将集合公开为IEnumerable总是一个好主意,因为在这种情况下可以很容易地应用LINQ查询。

二叉树本身是非常无用的,内部细节(节点)甚至不那么有趣。因此,将内部细节作为接口公开可能是没有用的。将二叉树公开为特定的接口可能也太过分了——如果你需要它来表示某种排序结构IList/ICollection,或者IDictionary可能就足够了。

请注意,如果您正在构建二进制树作为其他几个有趣集合的基础,您可能会考虑接口,但它应该由测试特定代码片段的需求驱动。