С# необычный синтаксис наследования w/generics

Я столкнулся с этим в определении класса NHibernate:

public class SQLiteConfiguration : PersistenceConfiguration<SQLiteConfiguration>

Таким образом, этот класс наследуется от базового класса, который параметризуется... производным классом?   Моя голова просто взорвалась.

Может кто-нибудь объяснить, что это значит и как этот шаблон полезен?

(Это, кстати, не вопрос, связанный с NHibernate).

Ответ 2

Я использовал тот же шаблон при разработке двойного связанного дерева. Каждый 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<>, будет содержать свойства для родительских и дочерних объектов соответствующего типа. Этот трюк для меня - чистая магия.