Czy ktoś może mi pomóc zrozumieć, dlaczego klasa dziedziczy po bazie tego samego typu?
Nie jest, dziedziczy po Page<T>
, ale T
sam w sobie jest sparametryzowany przez typ, z którego pochodzi BasePage<T>
.
Aby wywnioskować, dlaczego, musisz spojrzeć na to, jak T
faktycznie używany jest parametr type . Po pewnym kopaniu, idąc w górę łańcucha spadkowego, natkniesz się na tę klasę:
( 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);
}
}
O ile widzę, jedynym celem ogólnego ograniczenia jest upewnienie się, że Create
metoda zwraca możliwie najmniej abstrakcyjny typ.
Nie jestem jednak pewien, czy warto, ale może jest za tym jakiś dobry powód lub może to być tylko dla wygody, a może nie kryje się za tym zbyt wiele substancji i to po prostu zbyt skomplikowany sposób na uniknięcie obsady (BTW, ja nie sugeruję, że tak jest w tym przypadku, mówię tylko, że ludzie czasem tak robią).
Należy pamiętać, że to nie pozwala im uniknąć refleksji - w api.Pages
to repozytorium stron, które uzyskuje typeof(T).Name
i przekazuje go jako typeId
do contentService.Create
metody ( patrz tutaj ).