Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Específicamente, ¿alguien puede darme ejemplos concretos de cuándo o cuándo no usar clases anidadas?

Conozco esta característica desde siempre, pero nunca tuve una razón para usarla.

Gracias.

¿Fue útil?

Solución

Cuando la clase anidada solo es utilizada por la clase externa, un gran ejemplo, que ya no es necesario, es para una clase de enumerador para una colección.

otro ejemplo podría ser que una enumeración reemplace un parámetro falso verdadero utilizado por un método dentro de una clase, para aclarar la firma de la llamada ...

en lugar de

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

y

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

lo que no deja claro qué significa "verdadero", podría escribir:

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);  

Lo que aclara el valor del parámetro en el código del cliente.

Otros consejos

Los dos lugares donde uso clases anidadas:

  • La clase anidada es utilizada exclusivamente por la clase externa, y quiero un alcance completamente privado.

  • La clase anidada se usa específicamente para implementar una interfaz definida en otra parte. Por ejemplo, la implementación de un enumerador cae en esta categoría.

Realmente solo desea usar clases anidadas cuando está seguro de que la clase anidada no tiene sentido de que se use en otro lugar.

Por ejemplo, si necesita crear una lista de varios tipos de objetos asociados con funciones e información de miembros sobre ese conjunto de objetos por un corto tiempo (como métodos o propiedades), puede usar una clase anidada para hacerlo . Tal vez necesite crear una lista de todas las combinaciones de algún tipo de objeto y luego marcar todas las combinaciones que tengan una determinada propiedad. Ese sería un buen caso para una clase anidada.

Si no necesita métodos en la clase anidada, probablemente pueda usar una estructura pero no sé si IL los trata de manera diferente.

A veces uso esto para clases auxiliares simples que necesito para una función o dos dentro de la clase padre.

Para un ejemplo práctico, vea esta pregunta que se hizo esta mañana:
Haga que un objeto sea accesible solo ¿otro objeto en el mismo ensamblaje?

Resumen: puede anidar una clase de datos asociada dentro de su objeto comercial.

He visto casos de clases anidadas cuando una estructura de datos de propósito especial se usa solo dentro de una clase, o se lanza una cierta excepción y se captura solo dentro de una clase.

Anido clases cuando tengo una clase auxiliar que no necesita ser visible para ningún otro objeto en el sistema. Esto mantiene la visibilidad lo más restringida posible, lo que ayuda a evitar usos no deseados de la clase

Siguiendo las 'reglas' del tío Bob sobre la cohesión debería descubrir que realmente creas un buen número de clases anidadas (y anidadas, anidadas). Estos podrían hacerse no anidados, pero solo si tiene otros clientes que los hagan referencia ahora.

¡Me gustaría mejorar mi respuesta anterior!

Un área específica donde uso clases anidadas regularmente es habilitar la inyección de interfaz y la inversión de control. Ejemplo ...

public class Worker
{
  private IHelper _helper;

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

  private class DefaultHelper : IHelper
  {
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top