所以,我有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