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
Mary-Kate Olsenoriginal
2025-01-11 06:46:41206parcourir

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>

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>

    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>

    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!

Déclaration:
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