C # необычный синтаксис наследования с дженериками - PullRequest
10 голосов
/ 08 января 2011

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

public class SQLiteConfiguration : PersistenceConfiguration<SQLiteConfiguration>

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

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

(Кстати, это НЕ специфичный для NHibernate вопрос.)

Ответы [ 2 ]

5 голосов
2 голосов
/ 08 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...