Antara muka kovarian dan kontravarian dalam C#
Antara muka kovarian dan kontravarian dalam C# memberikan fleksibiliti yang lebih besar apabila berurusan dengan jenis dan hierarki warisannya.
Antara muka kovarian (keluar T)
Antara muka kovarian menyatakan bahawa parameter jenis generik boleh dianggap sebagai jenis peringkat lebih tinggi dalam hierarki warisan. Untuk antara muka yang diisytiharkan sebagai interface IBibble<out T>
, anda boleh menganggap rujukan antara muka sebagai mewakili jenis yang diperoleh daripada T.
Antara muka penyongsang (dalam T)
Antara muka kontravarian membenarkan parameter jenis generik dianggap sebagai jenis peringkat rendah dalam hierarki warisan. Apabila antara muka ditakrifkan sebagai interface IBibble<in T>
, rujukan antara muka boleh dianggap sebagai jenis yang mewakili jenis asas T.
Aplikasi praktikal kovarians
Kovarian membolehkan anda merawat koleksi jenis terbitan seolah-olah koleksi jenis asas. Sebagai contoh, pertimbangkan senarai haiwan, masing-masing dengan nama. Anda boleh mendapatkan semula nama semua haiwan dengan selamat kerana semua haiwan mempunyai nama.
Aplikasi praktikal penyongsang
Kontravarian membolehkan menambah jenis terbitan pada koleksi jenis asas. Contohnya, jika anda mempunyai akses kepada koleksi Haiwan dan perlu menambahkan ikan padanya, anda boleh berbuat demikian kerana semua ikan adalah haiwan. Bagaimanapun, usaha mengambil ikan daripada kutipan tidak dibenarkan kerana tiada jaminan koleksi itu hanya mengandungi ikan.
Lokasi input dan output
Dalam C# 4.0, kata kunci in
dan out
secara eksplisit menandakan antara muka sebagai kovarian atau kontravarian. in
menentukan lokasi input (parameter kaedah, sifat tulis sahaja), manakala out
menunjukkan lokasi output (nilai pulangan kaedah, sifat baca sahaja, out
parameter kaedah).
Contoh
Contoh berikut menunjukkan kovarians dan kontravarians:
<code class="language-csharp">interface IBibbleOut<out T> { } interface IBibbleIn<in T> { } class Program { static void Main(string[] args) { var b = GetOutDescendant(); // b只能保存Descendant对象 var d = GetInBase(); // d可以接收Base和Descendant对象 } static IBibbleOut<Descendant> GetOutDescendant() { return null; } static IBibbleIn<Base> GetInBase() { return null; } } class Base { } class Descendant : Base { }</code>
Tanpa kovarians dan kontravarian, pengkompil tidak akan dapat menjamin keselamatan jenis dalam kod contoh, yang mungkin membawa kepada ralat.
Atas ialah kandungan terperinci Bagaimanakah Kovarian dan Kontravarian Meningkatkan Keselamatan dan Fleksibiliti Jenis dalam Antara Muka C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!