Maison > développement back-end > C++ > Comment puis-je obtenir un polymorphisme avec des types génériques ouverts en C# ?

Comment puis-je obtenir un polymorphisme avec des types génériques ouverts en C# ?

Mary-Kate Olsen
Libérer: 2025-01-11 06:46:41
original
205 Les gens l'ont consulté

How Can I Achieve Polymorphism with Open Generic Types in C#?

Polymorphisme utilisant des types génériques ouverts en C#

Lorsque vous traitez du code générique, vous rencontrez généralement des scénarios dans lesquels vous devez exploiter différents types de données. Cependant, le polymorphisme générique de C# présente des limites lorsqu'il s'agit de traiter des types génériques ouverts.

Question

Considérez le code suivant :

<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>
Copier après la connexion

Dans cet exemple, vous souhaitez créer une liste pouvant contenir des instances de différents sous-types de données. Cependant, la dernière ligne échoue avec une erreur du compilateur car les types génériques ouverts (par exemple Data) nécessitent que les paramètres de type soient spécifiés.

Solution

C# ne prend pas en charge le vrai polymorphisme pour les types génériques ouverts. Pour pallier à ce problème, vous avez plusieurs options :

  1. Créer une liste d'objets :

    <code class="language-csharp"> List<object> dataCollection = new List<object>();
    
     dataCollection.Add(new DecimalData());
     dataCollection.Add(new StringData());</code>
    Copier après la connexion

    Cependant, cette approche perd la sécurité des types et nécessite une conversion explicite lors de l'accès aux données.

  2. Utiliser des interfaces non génériques ou des classes abstraites :

    <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>
    Copier après la connexion

    Cela permet des opérations non génériques sur les éléments de la liste, au détriment d'une certaine généricité et de la sécurité des types.

Il est important de comprendre les limites et les compromis liés à l'utilisation de types génériques ouverts en C# et de choisir la solution la mieux adaptée à vos besoins spécifiques.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal