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
}
LinkedListNodeest peu susceptible d'être utile sans la LinkedListclasse elle-même. Même si LinkedListcertaines fonctions renvoyaient un LinkedListNodeobjet qu'un utilisateur LinkedListpourrait utiliser, elles ne sont LinkedListNodeutiles que lorsqu'elles LinkedListsont utilisées. Pour cette raison, faire de la classe "node" une classe homologue de LinkedListpollue la portée contenante.