Kovarian dan kontravarian: fahami perbezaan antara "input" dan "output"
Kovarian dan kontravarian ialah konsep dalam pengaturcaraan yang melibatkan cara jenis generik diperuntukkan atau diakses daripada jenis atau jenis yang diwarisi yang berkaitan dengannya.
Kovarian: kedudukan output
Kovarian membenarkan jenis yang lebih umum (atau "lebih besar") digunakan sebagai ganti jenis yang lebih khusus apabila jenis primitif hanya digunakan sebagai nilai output. Sebagai contoh, senarai buah-buahan boleh dianggap sebagai senarai pisang, kerana tiada sekatan untuk menukar jenis yang lebih khusus kepada jenis yang lebih umum:
<code>List<水果> 水果列表 = new List<水果>(); 水果列表.Add(new 香蕉()); // 有效,因为香蕉是水果</code>
Penyongsangan: kedudukan input
Contravariance membenarkan jenis yang lebih khusus (atau "lebih kecil") digantikan dengan jenis yang lebih umum apabila jenis asal hanya digunakan sebagai nilai input. Ini kerana jenis yang lebih khusus boleh dikecilkan dengan selamat kepada jenis yang lebih umum:
<code>MyInterface<基类> 基类接口 = new MyInterface<派生类>(); // 有效,因为派生类是基类</code>
notasi "Input" dan "Output"
Kata kunci "masuk" dan "keluar" boleh digunakan dalam definisi antara muka generik untuk menentukan sama ada parameter jenis generik mewakili lokasi output atau lokasi input.
Dengan menyatakan "masuk" atau "keluar", pengkompil boleh melakukan operasi hantaran yang selamat tanpa penukaran yang jelas.
Contoh praktikal
Pertimbangkan antara muka generik yang mengambil parameter jenis sebagai parameter:
<code>interface MyInterface<T> { void Process(T value); }</code>
Jika anda menggunakan penyongsangan untuk melaksanakan antara muka ini:
<code>interface MyInterface<in T> { void Process(T value); }</code>
Ini bermakna mana-mana objek dari mana-mana kelas terbitan boleh dihantar sebagai parameter kepada kaedah Proses. Ini berguna apabila logik dalam kaedah hanya memerlukan jenis kelas asas tanpa mengira jenis objek sebenar.
Sebaliknya, jika anda melaksanakan antara muka menggunakan kovarians:
<code>interface MyInterface<out T> { T GetValue(); }</code>
Ini bermakna mana-mana objek dari mana-mana kelas asas boleh dikembalikan daripada kaedah GetValue. Ini berguna apabila kaedah mengembalikan jenis yang lebih umum yang boleh ditukar dengan selamat kepada pelbagai jenis tertentu.
Atas ialah kandungan terperinci Apakah Perbezaan Antara Kovarian dan Kontravarian dalam Pengaturcaraan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!