Pengguguran Kelas Kovarian C# 4.0: Pandangan Lebih Dalam
C# 4.0 memperkenalkan varians generik untuk antara muka, membolehkan penggunaan parameter jenis fleksibel. Walau bagaimanapun, fungsi ini tidak diperluaskan kepada kelas. Artikel ini menyelidiki rasional di sebalik pilihan reka bentuk ini.
Halangan Pelaksanaan
Memperkenalkan varians kovarian kepada kelas (cth., kelas C<T>
hipotesis) membentangkan cabaran pelaksanaan yang ketara. Had utama timbul daripada fakta bahawa T
hanya boleh digunakan sebagai parameter output, dalam penetap atau sebagai medan.
Kekangan ini adalah akibat langsung daripada medan kekurangan getter. Tidak seperti sifat, medan tidak menyediakan akses baca sahaja. Oleh itu, kelas kovarian tidak boleh mempunyai keadaan boleh ubah, mengehadkan penggunaan praktikalnya dengan teruk.
Menimbang Kos dan Faedah
Walaupun kelas tidak berubah kovarian (seperti senarai dan tindanan) tidak dapat dinafikan berfaedah, pengubahsuaian meluas pada sistem jenis C# yang diperlukan untuk menyokongnya tidak dianggap wajar pada masa keluaran C# 4.0.
Menggambarkan Kovarians dalam Struktur Tidak Boleh Berubah
Contoh berikut menunjukkan kovarians dalam timbunan tidak berubah:
<code class="language-csharp">sealed class Stack<out T> { private readonly T head; private readonly Stack<T> tail; }</code>
Ini membolehkan tugasan kovarian:
<code class="language-csharp">Stack<string> strings = null; strings = strings.Push("hello"); strings = strings.Push("goodbye"); Stack<object> objects = strings; // Covariant assignment objects = objects.Push(123); //This would be an error if Stack<T> was mutable</code>
Menambah integer pada tindanan kekal selamat jenis kerana ketakbolehubah tindanan. Operasi tidak melanggar keselamatan jenis.
Atas ialah kandungan terperinci Mengapa Kelas Kovarian Tidak Disokong dalam C# 4.0?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!