Frage

    

Diese Frage bereits eine Antwort hier:

         

Insbesondere kann jemand mir konkrete Beispiele, wann oder wenn keine verschachtelten Klassen verwenden?

Ich habe über diese Funktion bekannt, da immer, aber hatte nie einen Grund, es zu verwenden.

Danke.

War es hilfreich?

Lösung

Wenn die verschachtelte Klasse nur durch die äußeree Klasse, ein großartiges Beispiel, nicht mehr notwendig, verwendet wird, ist für eine Aufzählungsklasse für eine Sammlung.

Ein weiteres Beispiel könnte sein, dass eine ENUM einen echten falschen Parameter durch ein Verfahren innerhalb einer Klasse zu ersetzen, um den Anruf Signatur zu klären ...

statt

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

und

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

, die es unklar lässt, was ‚wahr‘ bedeutet, könnte man schreiben:

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

Welche der Parameterwert klar im Client-Code macht.

Andere Tipps

Die beiden Orte, an denen ich verschachtelte Klassen verwenden:

  • Die verschachtelte Klasse wird ausschließlich durch die äußeren Klasse verwendet wird, und ich möchte ganz privaten Rahmen.

  • Die verschachtelte Klasse verwendet wird speziell eine Schnittstelle an anderer Stelle definiert umzusetzen. Zum Beispiel fällt in diese Kategorie einen Enumerator implementieren.

Sie wollen wirklich nur verschachtelte Klassen verwenden, wenn Sie sicher, dass die verschachtelte Klasse sind nicht sinnvoll, dass es anderswo verwendet werden würde.

Zum Beispiel, wenn Sie benötigen eine Liste von mehreren Arten von Objekten assoziiert wird zusammen mit Funktionen und Mitglied Informationen über diesen Satz von Objekten für eine kurze Zeit (wie Methoden oder Eigenschaften), könnten Sie eine verschachtelte Klasse verwenden, das zu tun, . Vielleicht brauchen Sie eine Liste aller Kombinationen von irgendeiner Art von Objekt zu erstellen, und dann alle Kombinationen markieren, die eine bestimmte Eigenschaft haben. Das wäre ein gutes Beispiel für eine verschachtelte Klasse sein.

Wenn Sie Methoden nicht auf die verschachtelte Klasse, können Sie wahrscheinlich nur verwenden struct , aber ich weiß nicht, ob IL sie behandelt anders.

Ich benutze dies manchmal für einfache Hilfsklassen, die ich für eine Funktion oder zwei innerhalb der Elternklasse benötigen.

Ein praktisches Beispiel finden Sie diese Frage gestellt früher an diesem Morgen:
Machen Sie ein Objekt zugänglich nur ein anderes Objekt in der gleichen Assembly?

Zusammenfassung:. Sie können Nest eine zugehörige Datenklasse innen ist es Business-Objekt

Ich habe Fälle von verschachtelten Klassen gesehen, wenn eine Spezialdatenstruktur innerhalb einer Klasse nur verwendet wird, oder eine gewisse Ausnahme ausgelöst und gefangen nur innerhalb einer Klasse.

I Nest Klassen, wenn ich eine Hilfsklasse habe, die keine Notwendigkeit, in dem System zu einem anderen Objekt sichtbar zu sein hat. Dies hält die Sichtbarkeit so weit wie möglich eingeschränkt, die unbeabsichtigten Verwendungen der Klasse hilft zu verhindern

Nach Onkel Bob ‚Regeln‘ auf dem Zusammenhalt finden sollen, dass Sie recht tatsächlich schaffen eine Reihe von verschachtelten (und verschachtelt, verschachtelt!) Klassen. Diese könnte werden nicht verschachtelte gemacht, aber nur , wenn Sie andere Kunden haben, die sie jetzt verweisen.

Ich möchte auf meine Antwort verbessern!

Ein spezifischer Bereich, wo ich regelmäßig verschachtelte Klassen verwenden wird ermöglicht Interface-Injection und Inversion of Control. Beispiel ...

public class Worker
{
  private IHelper _helper;

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

  private class DefaultHelper : IHelper
  {
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top