Ответ 1
Это забавный любопытный повторяющийся шаблон шаблона, не так ли?
Я столкнулся с этим в определении класса NHibernate:
public class SQLiteConfiguration : PersistenceConfiguration<SQLiteConfiguration>
Таким образом, этот класс наследуется от базового класса, который параметризуется... производным классом? Моя голова просто взорвалась.
Может кто-нибудь объяснить, что это значит и как этот шаблон полезен?
(Это, кстати, не вопрос, связанный с NHibernate).
Это забавный любопытный повторяющийся шаблон шаблона, не так ли?
Я использовал тот же шаблон при разработке двойного связанного дерева. Каждый node имеет 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<>
, будет содержать свойства для родительских и дочерних объектов соответствующего типа. Этот трюк для меня - чистая магия.