Я использовал тот же шаблон при разработке дерева двойных связей. Каждый узел имеет 1 родителя и 0-много детей
class Tree<T> where T : Tree<T>
{
T parent;
List<T> children;
T Parent { get; set; }
protected Tree(T parent)
{
this.parent = parent;
parent.children.Add(this);
}
// lots more code handling tree list stuff
}
осуществление
class Coordinate : Tree<Coordinate>
{
Coordinate(Coordinate parent) : this(parent) { }
static readonly Coordinate Root = new Coordinate(null);
// lots more code handling coordinate systems
}
использование
Coordinate A = Coordinate.Root;
Coordinate B = new Coordinate(A);
B.Parent // returns a Coordinate type instead of a Node<>.
Таким образом, все, что наследуется от Tree<>
, будет содержать свойства для родительских и дочерних объектов соответствующего типа. Этот трюк для меня магия .