Pemahaman mendalam tentang antara muka kovarian dan kontravarian dalam C#
Kovarian dan kontravarian ialah konsep dalam pengaturcaraan berorientasikan objek yang mentakrifkan cara rujukan digunakan dengan jenis yang berbeza. Dalam C#, anda boleh menggunakan sintaks <out T>
dan <in T>
untuk menandakan antara muka sebagai kovarian atau kontravarian masing-masing.
Kovarian
Dalam C#, kovarians membenarkan rujukan antara muka dianggap sebagai rujukan kepada jenis yang lebih tinggi dalam hierarki. Contohnya, antara muka IBibble<out T>
boleh diberikan rujukan contoh IBibble<Descendant>
, selagi kelas Descendant
mewarisi daripada jenis T
. Ini bermakna apa sahaja yang boleh dilakukan pada IBibble<T>
juga boleh dilakukan pada IBibble<Descendant>
.
Penyongsang
Dalam C#, kontravarian membenarkan rujukan antara muka dianggap sebagai rujukan kepada jenis yang lebih rendah dalam hierarki. Contohnya, antara muka IBibble<in T>
boleh diberikan rujukan contoh IBibble<Base>
, selagi jenis Base
mewarisi daripada jenis T
. Ini bermakna mana-mana objek yang boleh ditetapkan kepada IBibble<Base>
juga boleh ditetapkan kepada IBibble<Descendant>
.
Kegunaan dan Aplikasi
Kovarian berguna apabila bekerja dengan koleksi objek yang berkongsi jenis asas yang sama. Dengan menggunakan antara muka kovarian, kami memastikan bahawa operasi yang dilakukan pada jenis asas juga digunakan untuk semua jenis terbitan.
Kontravarian berguna apabila berurusan dengan kilang atau perwakilan yang menerima parameter pelbagai jenis. Dengan menggunakan antara muka kontravarian, kami memastikan bahawa sebarang objek yang boleh ditetapkan kepada jenis asas juga boleh digunakan sebagai parameter kilang atau perwakilan.
Contoh
Pertimbangkan coretan kod berikut:
<code class="language-csharp">namespace SO2719954 { class Base { } class Descendant : Base { } interface IBibbleOut<out T> { } interface IBibbleIn<in T> { } class Program { static void Main(string[] args) { // 协变示例 IBibbleOut<Base> b = GetOutDescendant(); // IBibbleOut<Descendant> 赋值 // 逆变示例 IBibbleIn<Descendant> d = GetInBase(); // IBibbleIn<Base> 赋值 } static IBibbleOut<Descendant> GetOutDescendant() { return null; } static IBibbleIn<Base> GetInBase() { return null; } } }</code>
Dalam contoh ini, antara muka IBibbleOut<out T>
ialah kovarian, membenarkan b
merujuk Descendant
objek; antara muka IBibbleIn<in T>
adalah bertentangan, membenarkan d
merujuk Base
objek.
Atas ialah kandungan terperinci Bagaimanakah Kovarian dan Kontravarian Meningkatkan Penggunaan Antara Muka dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!