Domanda

    

Questa domanda ha già una risposta qui:

         

In particolare, qualcuno può darmi esempi concreti su quando o quando non usare le classi nidificate?

Conosco questa funzione da sempre, ma non ho mai avuto motivo di usarla.

Grazie.

È stato utile?

Soluzione

Quando la classe nidificata viene utilizzata solo dalla classe esterna, un grande esempio, non più necessario, è per una classe enumeratrice per una raccolta.

un altro esempio potrebbe essere che un enum sostituisca un vero parametro falso usato da un metodo all'interno di una classe, per chiarire la firma della chiamata ...

anziché

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

e

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

che non rende chiaro cosa significhi "vero", potresti scrivere:

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

Il che rende chiaro il valore del parametro nel codice client.

Altri suggerimenti

I due posti in cui utilizzo le classi nidificate:

  • La classe nidificata viene utilizzata esclusivamente dalla classe esterna e voglio un ambito completamente privato.

  • La classe nidificata viene utilizzata specificamente per implementare un'interfaccia definita altrove. Ad esempio, l'implementazione di un enumeratore rientra in questa categoria.

Vuoi davvero usare le classi nidificate solo quando sei sicuro che la classe nidificata non abbia senso che sarebbe usata da nessun'altra parte.

Ad esempio, se fosse necessario creare un elenco di diversi tipi di oggetti associati a funzioni e informazioni sui membri di quel set di oggetti per un breve periodo (come metodi o proprietà), è possibile utilizzare una classe nidificata per farlo . Forse è necessario creare un elenco di tutte le combinazioni di un tipo di oggetto e quindi contrassegnare tutte le combinazioni che hanno una determinata proprietà. Sarebbe un buon caso per una classe nidificata.

Se non hai bisogno di metodi sulla classe nidificata, probabilmente puoi semplicemente usare una struct ma non so se IL li tratta in modo diverso.

A volte lo uso per semplici classi di supporto di cui ho bisogno per una o due funzioni all'interno della classe genitore.

Per un esempio pratico, vedi questa domanda posta questa mattina presto:
Rendi un oggetto accessibile solo a un altro oggetto nello stesso assieme?

Riepilogo: è possibile nidificare una classe di dati associata all'interno del suo oggetto business.

Ho visto casi di classi nidificate quando una struttura di dati per scopi speciali viene utilizzata solo all'interno di una classe o quando viene generata una determinata eccezione e rilevata solo all'interno di una classe.

Nido delle classi quando ho una classe helper che non ha bisogno di essere visibile a nessun altro oggetto nel sistema. Ciò mantiene la visibilità quanto più limitata possibile, il che aiuta a prevenire usi involontari della classe

Seguendo le "regole" di zio Bob sulla coesione, dovresti scoprire che in realtà crei un certo numero di classi nidificate (e nidificate, nidificate!). Questi potrebbero essere resi non nidificati ma solo se hai altri clienti che li fanno riferimento ora.

Vorrei migliorare la mia risposta precedente!

Un'area specifica in cui uso regolarmente classi nidificate è abilitare l'Iniezione Iniezione e l'Inversione del Controllo. Esempio ...

public class Worker
{
  private IHelper _helper;

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

  private class DefaultHelper : IHelper
  {
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top