246 votes

Pourquoi aurais-je besoin d'utiliser des classes imbriquées en C# ?

J'essaie de comprendre les classes imbriquées en C#. Je comprends qu'une classe imbriquée est une classe qui est définie à l'intérieur d'une autre classe, mais je ne comprends pas pourquoi j'aurais besoin de faire cela.

20voto

Reed Copsey Points 315315

Il est parfois utile d'implémenter une interface qui sera retournée par la classe, mais l'implémentation de cette interface doit être complètement cachée au monde extérieur.

Par exemple, avant l'ajout de yield à C#, une façon d'implémenter les énumérateurs était de mettre l'implémentation de l'énumérateur comme une classe privée dans une collection. Cela permettait d'accéder facilement aux membres de la collection, mais le monde extérieur n'avait pas besoin de voir les détails de l'implémentation.

6voto

Fernando Points 3097

Les classes imbriquées sont très utiles pour implémenter des détails internes qui ne doivent pas être exposés. Si vous utilisez Reflector pour vérifier des classes comme Dictionary<Tkey,TValue> ou Hashtable, vous trouverez quelques exemples.

5voto

Henk Holterman Points 153608

Lorsqu'on imbrique un type (classe/enum/interface/structure/délégué) à l'intérieur d'une classe externe, cette classe externe prend effectivement le rôle d'un namespac e. Les raisons d'imbriquer un type sont donc les mêmes que pour l'utilisation des espaces de noms, à savoir qu'elles tendent à être plus fines et qu'elles sont utilisées ou nécessaires moins souvent.

Ce trait à grain fin rend l'utilisation privée/protégée plus probable, mais il existe également des arguments en faveur des types publics imbriqués, dans la mesure où cela permet de garder l'espace de noms environnant propre :

namespace Containers
{
  public class LinkedList 
  {
    public class Element { }
  }

  public class AvlTree
  {
    public class Element { }    
  }
}

Je soupçonne (mais je ne trouve pas de source) qu'une objection contre les types imbriqués (publics) pourrait être qu'ils ne sont pas conformes au CLR.

4voto

lambertwm Points 26

Peut-être est-ce un bon exemple d'utilisation de classes imbriquées ?

// ORIGINAL
class ImageCacheSettings { }
class ImageCacheEntry { }
class ImageCache
{
    ImageCacheSettings mSettings;
    List<ImageCacheEntry> mEntries;
}

Et :

// REFACTORED
class ImageCache
{
    Settings mSettings;
    List<Entry> mEntries;

    class Settings {}
    class Entry {}
}

PS : Je n'ai pas pris en compte les modificateurs d'accès à appliquer (privé, protégé, public, interne).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X