Für das Projekt, an dem ich derzeit arbeite, muss ich eine Baumdatenstruktur erstellen. Unten ist ein Beispiel, wie ich versucht habe, diese Funktionalität zu erreichen. Ich habe mich entschieden, eine Sammlung von Kindknoten als verschachtelte Klasse zu erstellen, da dies mir erlaubt, Nodes Elternteil in seiner Add()-Methode zu setzen, während ich den Eltern-Setter privat halte, so dass von Node abgeleitete Klassen oder andere Klassen in derselben Assembly keinen direkten Zugriff darauf erhalten können.
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;
...
}
}
}
Dieser Code lässt sich jedoch nicht kompilieren. Er beschwert sich über this.mChildren = new ChildNodeCollection(this)
Zeile im Node-Konstruktor. Es werden diese beiden Fehler ausgelöst.
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
Ich schätze, es kann nicht herausfinden, dass T Node ist, obwohl ich das in der Klassendefinition angegeben habe. Ich bin neugierig, wenn jemand eine Idee hat, wie dies anders in einer Weise, die mir erlauben würde, Node's Elternteil zu setzen, wenn es zu Sammlung hinzufügen, ohne Node's Parent-Eigenschaft zu viel mit internen Zugriffsmodifikator freizulegen getan werden könnte.