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.
Réponses
Trop de publicités?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.
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.
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).
- Réponses précédentes
- Plus de réponses