Apabila berurusan dengan kod generik, anda biasanya menghadapi senario di mana anda perlu mengendalikan pelbagai jenis data. Walau bagaimanapun, polimorfisme generik C# mempunyai batasan apabila berurusan dengan jenis generik terbuka.
Pertimbangkan kod berikut:
<code class="language-csharp">public abstract class Data<T> { } public class StringData : Data<string> { } public class DecimalData : Data<decimal> { } List<Data<T>> dataCollection = new List<Data<T>>(); // 错误:缺少类型参数 dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());</code>
Dalam contoh ini, anda ingin membuat senarai yang boleh menyimpan kejadian subjenis Data yang berbeza. Walau bagaimanapun, baris terakhir gagal dengan ralat pengkompil kerana jenis generik terbuka (cth. Data) memerlukan parameter jenis untuk ditentukan.
C# tidak menyokong polimorfisme sebenar untuk jenis generik terbuka. Untuk mengatasi masalah ini, anda mempunyai beberapa pilihan:
Buat senarai objek:
<code class="language-csharp"> List<object> dataCollection = new List<object>(); dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());</code>
Walau bagaimanapun, pendekatan ini kehilangan keselamatan jenis dan memerlukan penukaran yang jelas apabila mengakses data.
Gunakan antara muka bukan generik atau kelas abstrak:
<code class="language-csharp"> public interface IData { void SomeMethod(); } public abstract class Data<T> : IData { public void SomeMethod() { } } List<IData> dataCollection = new List<IData>(); dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());</code>
Ini membolehkan operasi bukan generik pada elemen senarai, dengan mengorbankan beberapa kemurahan dan keselamatan jenis.
Adalah penting untuk memahami batasan dan pertukaran penggunaan jenis generik terbuka dalam C# dan memilih penyelesaian yang paling sesuai dengan keperluan khusus anda.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Polimorfisme dengan Jenis Generik Terbuka dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!