Проект, над которым я сейчас работаю, требует от меня создания древовидной структуры данных.
Ниже приведен пример того, как я пытался добиться этой функциональности. Я решил создать коллекцию дочерних узлов как вложенный класс, так как он позволяет мне устанавливать родительский узел в его методе Add (), сохраняя приватность родительского установщика, чтобы классы, производные от узла или других классов в той же сборке, не могли получить прямой доступ к нему.
class Node<T> where T : Node<T>
{
private T mParent;
private ChildNodeCollection<T> mChildren;
public T Parent
{
get{return this.InnerParent;}
}
private T InnerParent
{
get{return this.mParent;}
set {this.mParent = value;}
}
public Node()
{
this.mChildren = new ChildNodeCollection<T>(this);
}
class ChildNodeCollection<U> where U : T
{
private U mParent;
public U CollectionParent
{
get{return this.mParent;}
}
public ChildNodeCollection(U parent)
{
this.mParent = parent;
}
public void Add(U item)
{
item.InnerParent = this.CollectionParent;
...
}
}
}
Этот код не компилируется. Он жалуется на строку this.mChildren = new ChildNodeCollection(this)
в конструкторе Node. Он выбрасывает эти две ошибки.
Error 35 The best overloaded method match for Node<T>.ChildNodeColllection<T>.ChildNodeColllection(T)' has some invalid arguments
Error 36 Argument '1': cannot convert from Node<T> to T
Полагаю, не может получиться, что T - это Node, хотя я указал это в определении класса. Мне любопытно, если у кого-нибудь есть идеи, как это можно сделать по-другому, что позволило бы мне устанавливать родителя Node при добавлении его в коллекцию, не раскрывая слишком много свойства Node's Parent с помощью внутреннего модификатора доступа.