Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Membuat Senarai Jenis Generik Terbuka dalam C#?
Mengendalikan Senarai Jenis Generik Terbuka dalam C#
Bekerja dengan jenis generik terbuka (generik dengan parameter jenis yang tidak ditentukan) dalam C# memberikan cabaran kerana pengehadan dalam polimorfisme generik.
Cabaran:
Pertimbangkan kelas ini:
<code class="language-csharp">public abstract class Data<T> { } public class StringData : Data<string> { } public class DecimalData : Data<decimal> { }</code>
Percubaan untuk membuat senarai yang mengandungi contoh jenis Data
berbeza ini secara langsung gagal:
<code class="language-csharp">List<Data> dataCollection = new List<Data>(); // Compiler error! dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());</code>
Ralat pengkompil timbul kerana Data
ialah jenis generik terbuka, memerlukan hujah jenis.
Penyelesaian:
Ketiadaan pengendali berlian C# menghalang instantiasi langsung senarai generik terbuka. Polimorfisme tidak digunakan secara langsung untuk jenis generik terbuka. Penyelesaiannya ialah menggunakan jenis asas atau antara muka biasa:
<code class="language-csharp">public interface IData { void SomeMethod(); } public abstract class DataBase { public abstract void SomeMethod(); }</code>
Kini, anda boleh membuat senarai menggunakan antara muka atau kelas asas:
<code class="language-csharp">List<IData> dataList = new List<IData>(); dataList.Add(new StringData()); // StringData must implement IData dataList.Add(new DecimalData()); // DecimalData must implement IData foreach (var item in dataList) item.SomeMethod(); List<DataBase> dataBaseList = new List<DataBase>(); dataBaseList.Add(new StringData()); // StringData must inherit from DataBase dataBaseList.Add(new DecimalData()); // DecimalData must inherit from DataBase foreach (var item in dataBaseList) item.SomeMethod();</code>
Pendekatan ini membolehkan koleksi pelbagai Data
jenis, tetapi ia mengorbankan penaipan yang kuat berbanding dengan penyelesaian yang benar-benar generik. Contoh SomeMethod()
menyerlahkan keperluan untuk antara muka biasa atau kaedah abstrak untuk mengekalkan fungsi merentas jenis yang berbeza.
Bacaan Lanjut:
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membuat Senarai Jenis Generik Terbuka dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!