Maison >développement back-end >C++ >Comment puis-je obtenir une covariance avec la prise en charge des index dans les collections ?

Comment puis-je obtenir une covariance avec la prise en charge des index dans les collections ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-28 19:04:15196parcourir

How Can I Achieve Covariance with Index Support in Collections?

Covariance dans les collections avec prise en charge d'index

La covariance dans les collections permet de stocker des éléments dérivés dans une collection déclarée pour un type de base. Cependant, la collection de covariantes par défaut, IEnumerable, ne prend pas en charge les index.

Comme le note l'interrogateur, la conversion ascendante d'une liste à IList pourrait permettre l'ajout d'animaux autres que les chiens, ce qui n'est pas autorisé dans la liste originale collection.

Solutions possibles

À partir de .NET 4.5, IReadOnlyList et IReadOnlyCollection offrent à la fois un comportement covariant et des recherches d'index. Cependant, ils sont en lecture seule.

Création d'un wrapper covariant

Si une collection inscriptible avec prise en charge d'index est requise, une méthode d'extension peut être créée pour envelopper un IList< ;T> et exposez uniquement le sous-ensemble de méthodes qui fournissent la covariance souhaitée :

public static class Covariance
{
    public static IIndexedEnumerable<T> AsCovariant<T>(this IList<T> tail)
    {
        return new CovariantList<T>(tail);
    }
    private class CovariantList<T> : IIndexedEnumerable<T>
    {
        // Implementation...
    }
}

Cette classe wrapper, CovariantList, implémente IIndexedEnumerable, qui fournit un indexeur et une propriété count.

En appelant AsCovariant() sur un IList, vous pouvez obtenir une collection covariante avec prise en charge d'index, vous permettant de récupérer et de parcourir des éléments dérivés tout en conservant le type de base spécifié.

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