Итак, у меня есть 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, не зная, с какими типами DataType я столкнусь в дереве?
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;
}
Является ли мой единственный вариант сделать это, когда я знаю, какие типы DataType будет иметь конкретное дерево, которое я использую? Может быть, я поступаю неправильно, поэтому любые советы приветствуются. Спасибо!