Can some help me understand why the class is inheriting from a base of same type?
Non lo è, eredita da Page<T>
, ma T
è vincolato per essere parametrizzato da un tipo derivato da BasePage<T>
.
Per dedurre il motivo, devi considerare come viene effettivamente utilizzato il parametro di tipo T
.
Dopo un po 'di scavo, mentre ti sposti lungo la catena di ereditarietà, ti troverai su questa classe:
( github )
public class GenericPage<T> : PageBase where T : GenericPage<T>
{
public bool IsStartPage {
get { return !ParentId.HasValue && SortOrder == 0; }
}
public GenericPage() : base() { }
public static T Create(IApi api, string typeId = null)
{
return api.Pages.Create<T>(typeId);
}
}
Per quanto posso vedere, l'unico scopo del vincolo generico è di assicurarsi che il metodo Create
restituisca il tipo meno astratto possibile.
Non so se ne valga la pena, ma forse c'è qualche buon motivo dietro, o potrebbe essere solo per comodità, o forse non c'è troppa sostanza dietro di esso ed è solo un modo troppo elaborato per evitare un cast ( A proposito, non sto insinuando che è il caso qui, sto solo dicendo che le persone lo fanno a volte).
Si noti che questo non consente loro di evitare riflessioni - il api.Pages
è un repository di pagine che ottiene typeof(T).Name
e lo passa come typeId
al metodo contentService.Create
(vedi qui ).