Gestion des listes de types génériques ouverts en C#
Travailler avec des types génériques ouverts (génériques avec des paramètres de type non spécifiés) en C# présente des défis en raison des limitations du polymorphisme générique.
Le défi :
Considérez ces cours :
<code class="language-csharp">public abstract class Data<T> { } public class StringData : Data<string> { } public class DecimalData : Data<decimal> { }</code>
La tentative de création d'une liste contenant des instances de ces différents Data
types échoue directement :
<code class="language-csharp">List<Data> dataCollection = new List<Data>(); // Compiler error! dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());</code>
L'erreur du compilateur se produit car Data
est un type générique ouvert, nécessitant un argument de type.
La solution :
L'absence d'opérateur diamant en C# empêche l'instanciation directe de listes de génériques ouverts. Le polymorphisme ne s'applique pas directement aux types génériques ouverts. La solution de contournement consiste à utiliser un type ou une interface de base commune :
<code class="language-csharp">public interface IData { void SomeMethod(); } public abstract class DataBase { public abstract void SomeMethod(); }</code>
Maintenant, vous pouvez créer une liste en utilisant l'interface ou la classe de base :
<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>
Cette approche permet une collection de différents Data
types, mais elle sacrifie un typage fort par rapport à une solution véritablement générique. L'exemple SomeMethod()
met en évidence la nécessité d'une interface commune ou d'une méthode abstraite pour maintenir les fonctionnalités entre différents types.
Lectures complémentaires :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!