Mit der objektorientierten Programmierung können wir eine Klasse innerhalb einer Klasse (einer verschachtelten Klasse) erstellen, aber ich habe in meinen 4 Jahren Erfahrung im Codieren noch nie eine verschachtelte Klasse erstellt.
Wofür eignen sich verschachtelte Klassen?
Ich weiß, dass eine Klasse als privat markiert werden kann, wenn sie verschachtelt ist, und dass wir von der übergeordneten Klasse aus auf alle privaten Mitglieder dieser Klasse zugreifen können. Wir könnten die Variablen einfach als privat in die enthaltende Klasse selbst einfügen.
Warum also eine verschachtelte Klasse erstellen?
In welchen Szenarien sollten verschachtelte Klassen verwendet werden oder sind sie leistungsstärker als andere Techniken?
c#
object-oriented
programming-practices
.net
class-design
Mayur Rathi
quelle
quelle
Antworten:
Das Hauptmerkmal verschachtelter Klassen besteht darin, dass sie auf private Mitglieder der äußeren Klasse zugreifen können, während sie die volle Leistungsfähigkeit einer Klasse besitzen. Sie können auch privat sein, was unter bestimmten Umständen eine ziemlich leistungsfähige Kapselung ermöglicht:
Hier sperren wir den Setter vollständig auf die Fabrik, da die Klasse privat ist, und kein Verbraucher kann sie herunterschalten und auf den Setter zugreifen, und wir können vollständig steuern, was erlaubt ist.
Ansonsten ist es nützlich, um Schnittstellen von Drittanbietern in einer kontrollierten Umgebung zu implementieren, in der wir weiterhin auf private Mitglieder zugreifen können.
Wenn wir zum Beispiel eine Instanz einer Schnittstelle für ein anderes Objekt bereitstellen, aber nicht möchten, dass unsere Hauptklasse es implementiert, können wir es von einer inneren Klasse implementieren lassen.
quelle
Outer
, würden Sie eine übergebenFunc<int>
, die nur lauten würde() => _example
Inner
nicht geschachtelt ist undinternal
nicht funktioniert (dh wenn Sie nicht mit verschiedenen Assemblys arbeiten). Der Lesbarkeitsgewinn von Verschachtelungsklassen macht es weniger günstig als die Verwendunginternal
(wo möglich).Normalerweise wird eine verschachtelte Klasse N in einer Klasse C erstellt, wenn C etwas intern verwenden muss, das niemals (direkt) außerhalb von C verwendet werden sollte, und aus welchem Grund etwas ein neuer Objekttyp sein muss, anstatt eines vorhandenen Art.
Ich glaube, dass dies am häufigsten geschieht, wenn eine Methode implementiert wird, die ein Objekt zurückgibt, das eine Schnittstelle implementiert, und wir möchten den konkreten Typ dieses Objekts verbergen, da er an keiner anderen Stelle nützlich ist.
Die Implementierung von IEnumerable ist ein gutes Beispiel dafür:
Es gibt einfach keinen Grund für jemanden außerhalb
BlobOfBusinessData
, den Betontyp zu kennen oder sich darum zu kümmernBusinessDatumEnumerator
, also können wir ihn genauso gut drinnen lassenBlobOfBusinessData
.Das sollte kein "Best-Practice" -Beispiel für die
IEnumerable
ordnungsgemäße Implementierung sein , sondern nur das Nötigste, um die Idee zu vermitteln. Daher habe ich Dinge wie eine expliziteIEnumerable.GetEnumerator()
Methode weggelassen.quelle
Node
Klasse in aLinkedList
. Jedem, derLinkedList
das verwendet, ist es egal, wie dasNode
implementiert wird, solange er auf die Inhalte zugreifen kann. Die einzige Entität, die sich überhaupt interessiert, ist dieLinkedList
Klasse selbst.Ich kann mir einige wichtige Gründe vorstellen:
1. Aktivieren Sie die Kapselung
Oft sind verschachtelte Klassen Implementierungsdetails der Klasse. Benutzer der Hauptklasse sollten sich nicht um ihre Existenz kümmern müssen. Sie sollten sie nach Belieben ändern können, ohne dass die Benutzer der Hauptklasse ihren Code ändern müssen.
2. Vermeiden Sie Namensverschmutzung
Sie sollten in einem Bereich keine Typen, Variablen, Funktionen usw. hinzufügen, es sei denn, sie sind für diesen Bereich geeignet. Dies unterscheidet sich geringfügig von der Verkapselung. Es könnte nützlich sein, die Schnittstelle eines verschachtelten Typs verfügbar zu machen, aber der richtige Platz für den verschachtelten Typ ist immer noch die Hauptklasse. In C ++ Land sind Iteratortypen ein solches Beispiel. Ich habe nicht genug Erfahrung in C #, um Ihnen konkrete Beispiele dafür zu geben.
Machen wir uns ein einfaches Beispiel, um zu veranschaulichen, warum das Verschieben einer verschachtelten Klasse in den gleichen Bereich wie die Hauptklasse Namensverschmutzung ist. Angenommen, Sie implementieren eine verknüpfte Listenklasse. Normalerweise würden Sie verwenden
Wenn Sie sich dazu entschließen,
Node
in den gleichen Bereich wie zu wechselnLinkedList
, haben SieLinkedListNode
ist unwahrscheinlich, ohneLinkedList
Klasse selbst nützlich zu sein . Selbst wennLinkedList
einige Funktionen bereitgestellt werden, die einLinkedListNode
Objekt zurückgeben, das ein Benutzer verwendenLinkedList
könnte, istLinkedListNode
dies nur dann sinnvoll, wennLinkedList
es verwendet wird. Aus diesem GrundLinkedList
verschmutzt das Festlegen der "Knoten" -Klasse zu einer Peer-Klasse den enthaltenen Bereich.quelle
Ich verwende öffentliche verschachtelte Klassen für verwandte Hilfsklassen.
Verwenden Sie sie für verwandte Variationen.
Der Anrufer kann wählen, welche Version für welches Problem geeignet ist. Manchmal kann eine Klasse nicht in einem Durchgang vollständig erstellt werden und erfordert eine veränderbare Version. Dies gilt immer für den Umgang mit zyklischen Daten. Mutables können später in schreibgeschützte Dateien konvertiert werden.
Ich benutze sie für interne Aufzeichnungen
quelle
Geschachtelte Klasse kann verwendet werden, wenn Sie mehr als eine Instanz der Klasse erstellen oder wenn Sie diesen Typ verfügbarer machen möchten.
Verschachtelte Klassen erhöhen die Kapselung und führen zu besser lesbarem und wartbarem Code.
quelle