Dapatkah beberapa orang membantu saya memahami mengapa kelas mewarisi dari jenis yang sama?
Bukan, ini merupakan turunan dari Page<T>
, tetapi T
itu sendiri dibatasi untuk menjadi parameter oleh tipe yang diturunkan BasePage<T>
.
Untuk menyimpulkan mengapa, Anda harus melihat bagaimana parameter tipe T
sebenarnya 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 Create
metode 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.Pages
adalah gudang halaman yang memperoleh typeof(T).Name
, dan dibagikan sebagai typeId
ke contentService.Create
metode ( lihat di sini ).