Alors pourquoi créer une classe imbriquée?
Je peux penser à quelques raisons importantes:
1. Activer l'encapsulation
Plusieurs fois, les classes imbriquées sont des détails d'implémentation de la classe. Les utilisateurs de la classe principale ne devraient pas avoir à se soucier de leur existence. Vous devriez pouvoir les modifier à volonté sans obliger les utilisateurs de la classe principale à changer leur code.
2. Évitez la pollution par les noms
Vous ne devez pas ajouter des types, des variables, des fonctions, etc. dans une étendue, sauf s'ils sont appropriés dans cette étendue. Ceci est légèrement différent de l'encapsulation. Il pourrait être utile d'exposer l'interface d'un type imbriqué, mais l'emplacement approprié pour le type imbriqué est toujours la classe principale. En terre C ++, les types d'itérateurs en sont un exemple. Je n'ai pas assez d'expérience en C # pour vous en donner des exemples concrets.
Faisons un exemple simpliste pour illustrer pourquoi le déplacement d'une classe imbriquée dans la même portée que la classe principale est une pollution de nom. Supposons que vous implémentez une classe de liste chaînée. Normalement, vous utiliseriez
publid class LinkedList
{
class Node { ... }
// Use Node to implement the LinkedList class.
}
Si vous décidez de passer Node
à la même portée que LinkedList
, vous aurez
public class LinkedListNode
{
}
public class LinkedList
{
// Use LinkedListNode to implement the class
}
LinkedListNode
est peu susceptible d'être utile sans la LinkedList
classe elle-même. Même si LinkedList
certaines fonctions renvoyaient un LinkedListNode
objet qu'un utilisateur LinkedList
pourrait utiliser, elles ne sont LinkedListNode
utiles que lorsqu'elles LinkedList
sont utilisées. Pour cette raison, faire de la classe "node" une classe homologue de LinkedList
pollue la portée contenante.