Вы смешиваете обязанности Узла с обязанностями коллекции. Видите, как вы устанавливаете родителя в коллекции? Это не коллекция, у которой есть родитель; это узел.
Я бы структурировал свои узлы так:
public class Node
{
public Node Parent {get;set;} // null for roots
public NodeCollection Children {get; private set;}
public Node()
{
Children = new NodeCollection();
Children.ChildAdded += ChildAdded;
Children.ChildRemoved += ChildRemoved;
};
private void ChildAdded(object sender, NodeEvent args)
{
if(args.Child.Parent != null)
throw new ParentNotDeadYetAdoptionException("Child already has parent");
args.Child.Parent = this;
}
private void ChildRemoved(object sender, NodeEvent args)
{
args.Child.Parent = null;
}
}
И NodeCollection будет выглядеть как
public class NodeCollection : INodeCollection {/*...*/}
и INodeCollection будет:
public interface INodeColleciton : IList<Node>
{
event EventHandler<NodeEvent> ChildAdded;
event EventHandler<NodeEvent> ChildRemoved;
}
Обязанности по сбору принадлежат дочерней коллекции узла. Вы можете, конечно, иметь узел, реализующий INodeCollection, но это вопрос вкусов программирования. Я предпочитаю иметь детскую общественную собственность (это как структура разработана).
В этой реализации вам не нужно реализовывать метод "GetChildren"; государственная детская собственность предоставляет их всем.