所以,我有2个接口:搜索在模板树
一个节点可以有孩子
public interface INode
{
IEnumeration<INode> Children { get; }
void AddChild(INode node);
}
而派生“数据节点”,可以有与它
public interface IDataNode<DataType> : INode
{
DataType Data;
IDataNode<DataType> FindNode(DataType dt);
}
相关数据
请记住,树中的每个节点可能具有与其数据相关的不同数据类型(因为INode.AddChild函数只需要基本INode)
这里是IDataNode接口的实现:
internal class DataNode<DataType> : IDataNode<DataType>
{
List<INode> m_Children;
DataNode(DataType dt)
{
Data = dt;
}
public IEnumerable<INode> Children
{
get { return m_Children; }
}
public void AddChild(INode node)
{
if (null == m_Children)
m_Children = new List<INode>();
m_Children.Add(node);
}
public DataType Data { get; private set; }
问题是我如何实现FindNode功能,不知道我会在树中遇到什么样的数据类型?
public IDataNode<DataType> FindNode(DataType dt)
{
throw new NotImplementedException();
}
}
正如你能想象这样的事情会不会制定出
public IDataNode<DataType> FindNode(DataType dt)
{
IDataNode<DataType> result = null;
foreach (var child in Children)
{
if (child is IDataNode<DataType>)
{
var datachild = child as IDataNode<DataType>;
if (datachild.Data.Equals(dt))
{
result = child as IDataNode<DataType>;
break;
}
}
else
{
// What??
}
// Need to recursively call FindNode on the child
// but can't because it could have a different
// DataType associated with it. Can't call FindNode
// on child because it is of type INode and not IDataNode
result = child.FindNode(dt); // can't do this!
if (null != result)
break;
}
return result;
}
是我做到这一点时,我知道我使用一个特定的树将有什么样的数据类型的唯一选择?也许我是以错误的方式解决这个问题的,所以任何提示都会被赞赏。谢谢!
FindNode应该做什么?为什么它仅在'IDataNode'中定义,而不是在'INode'中定义? – Jon 2010-05-12 00:12:05
我刚刚更新了我的问题,以在代码中添加注释,解释为什么我无法在子节点上调用FindNode。 @Jon,FindNode仅在节点中有数据时才相关(INode没有,只有IDataNode有)。 FindNode将查找具有与传入的数据相等的数据的第一个后代节点。 – floatingfrisbee 2010-05-12 00:17:30
我问了这些问题,因为回答他们会帮助你找到解决方案。首先,在你能够根本调用FindNode之前,你需要找到一个'IDataNode',这对你来说听起来不自然吗?你会如何找到它?考虑到在这之前你不能调用'FindNode(int)',你会如何找到你的第一个'IDataNode '?显然,代码需要重新编写。我会在下面提供一个答案。 –
Jon
2010-05-12 00:33:42