Dapatkah beberapa orang membantu saya memahami mengapa kelas mewarisi dari jenis yang sama?
Bukan, ini merupakan turunan dari Page<T>, tetapi Titu sendiri dibatasi untuk menjadi parameter oleh tipe yang diturunkan BasePage<T>.
Untuk menyimpulkan mengapa, Anda harus melihat bagaimana parameter tipe Tsebenarnya digunakan. Setelah beberapa penggalian, saat Anda naik ke rantai warisan, Anda akan menemukan kelas ini:
( 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);
}
}
Sejauh yang saya bisa lihat, satu-satunya tujuan untuk batasan generik adalah untuk memastikan bahwa Createmetode mengembalikan tipe abstrak paling tidak mungkin.
Tidak yakin apakah itu sepadan, tapi mungkin ada beberapa alasan bagus di baliknya, atau bisa saja untuk kenyamanan, atau mungkin tidak ada terlalu banyak zat di baliknya dan itu hanya cara yang terlalu rumit untuk menghindari gips (BTW, saya Saya tidak menyiratkan bahwa inilah yang terjadi di sini, saya hanya mengatakan bahwa kadang-kadang orang melakukan itu).
Perhatikan bahwa ini tidak memungkinkan mereka untuk menghindari refleksi - yang api.Pagesadalah gudang halaman yang memperoleh typeof(T).Name, dan dibagikan sebagai typeIdke contentService.Createmetode ( lihat di sini ).