Question

    

Cette question a déjà une réponse ici:

         

Plus précisément, quelqu'un peut-il me donner des exemples concrets de quand ou de ne pas utiliser de classes imbriquées?

Je connais cette fonctionnalité depuis toujours, mais je n'ai jamais eu de raison de l'utiliser.

Merci.

Était-ce utile?

La solution

Lorsque la classe imbriquée est uniquement utilisée par la classe externe, un excellent exemple, qui n'est plus nécessaire, concerne une classe d'énumérateur pour une collection.

un autre exemple pourrait consister en une énumération à remplacer un paramètre true faux utilisé par une méthode dans une classe, afin de clarifier la signature d'appel ...

au lieu de

public class Product
{
    public void AmountInInventory(int warehouseId, bool includeReturns)
    {
        int totalCount = CountOfNewItems();
        if (includeReturns)
            totalCount+= CountOfReturnedItems();
        return totalCount;
    }
}

et

  product P = new Product();
  int TotalInventory = P.AmountInInventory(123, true);  

ce qui ne dit pas clairement ce que veut dire "vrai", vous pouvez écrire:

public class Product
{
    [Flags]public enum Include{None=0, New=1, Returns=2, All=3 }
    public void AmountInInventory(int warehouseId, Include include)
    {
        int totalCount = 0;
        if ((include & Include.New) == Include.New)
            totalCount += CountOfNewItems();
        if ((include & Include.Returns) == Include.Returns)
            totalCount += CountOfReturns();
        return totalCount;
    }
}


  product P = new Product();
  int TotalInventory = P.AmountInInventory(123, Product.Include.All);  

Ce qui rend la valeur du paramètre claire dans le code client.

Autres conseils

Les deux endroits où j'utilise des classes imbriquées:

  • La classe imbriquée est utilisée exclusivement par la classe externe et je souhaite une portée entièrement privée.

  • La classe imbriquée est utilisée spécifiquement pour implémenter une interface définie ailleurs. Par exemple, la mise en œuvre d’un énumérateur appartient à cette catégorie.

Vous ne voulez vraiment utiliser les classes imbriquées que lorsque vous êtes sûr que la classe imbriquée n'a pas de sens qu'elle serait utilisée nulle part ailleurs.

Par exemple, si vous aviez besoin de créer une liste de plusieurs types d'objet associés à des fonctions et à des informations sur les membres concernant cet ensemble d'objets pendant une courte période (comme des méthodes ou des propriétés), vous pouvez utiliser une classe imbriquée pour le faire. . Vous devrez peut-être créer une liste de toutes les combinaisons d'un type d'objet, puis marquer toutes les combinaisons qui ont une propriété donnée. Ce serait un bon cas pour une classe imbriquée.

Si vous n'avez pas besoin de méthodes sur la classe imbriquée, vous pouvez probablement simplement utiliser une structure , mais je ne sais pas si IL les traite différemment.

J'utilise parfois cela pour les classes d'assistance simples dont j'ai besoin pour une fonction ou deux à l'intérieur de la classe parente.

Pour un exemple pratique, voir la question posée plus tôt ce matin:
Rendre un objet accessible uniquement un autre objet dans le même assemblage?

Résumé: vous pouvez imbriquer une classe de données associée dans son objet métier.

J'ai vu des cas de classes imbriquées lorsqu'une structure de données à usage spécifique est utilisée uniquement dans une classe, ou qu'une certaine exception est levée et interceptée uniquement dans une classe.

Je classe des classes lorsque j'ai une classe d'assistance qui n'a pas besoin d'être visible par un autre objet du système. Ceci maintient la visibilité aussi limitée que possible, ce qui permet d'éviter les utilisations involontaires de la classe

Si vous suivez les règles de cohésion de Oncle Bob, vous constaterez que vous créez en fait un grand nombre de classes imbriquées (et imbriquées, imbriquées!). Ces peuvent être non imbriqués mais uniquement si d'autres clients les référencent maintenant.

J'aimerais améliorer ma réponse précédente!

Un domaine spécifique dans lequel j'utilise régulièrement des classes imbriquées est l'activation de l'interface d'injection et l'inversion de contrôle. Exemple ...

public class Worker
{
  private IHelper _helper;

  public Worker()
    : this (new DefaultHelper())
  {
  }
  public Worker(IHelper helper)
  {
    this._helper = helper;
  }

  private class DefaultHelper : IHelper
  {
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top