Soll ich verschachtelte Klassen in diesem Fall?

stimmen
42

Ich arbeite an einer Sammlung von Klassen für die Video - Wiedergabe und Aufnahme verwendet. Ich habe eine Hauptklasse , die wie die öffentliche Schnittstelle fungiert, mit Methoden wie play(), stop(), pause(), record()etc ... Dann Arbeitspferd Klassen Ich habe , die die Video - Decodierung und Video - Encoding tun.

Ich habe gelernt, über die Existenz von verschachtelten Klassen in C ++, und ich bin neugierig, was Programmierer darüber nachdenken, sie zu benutzen. Ich bin ein wenig vorsichtig und nicht wirklich sicher, was die Vorteile / Nachteile sind, aber sie scheinen (nach dem Buch lese ich) in den Fällen verwendet werden, wie meine.

Das Buch legt nahe, dass in einem Szenario wie bei mir, eine gute Lösung zu nisten die Arbeitspferde Klassen in der Interface-Klasse sein würde, so gibt es keine separaten Dateien für Klassen wird der Client nicht verwenden soll, und mögliche Namenskonflikte zu vermeiden? Ich weiß nicht, über diese Begründungen. Verschachtelte Klassen sind ein neues Konzept für mich. sehen will, genau das, was Programmierer denkt über das Thema.

Veröffentlicht am 02/08/2008 um 03:51
quelle vom benutzer
In anderen Sprachen...                            


10 antworten

stimmen
25

Ich würde ein bisschen zögern, hier verschachtelte Klassen zu verwenden. Was passiert, wenn Sie eine abstrakte Basisklasse für einen „Multimedia-Treiber“ geschaffen, um das Back-End-Zeug (Zugpferd) und eine eigene Klasse für die Front-End-Arbeit zu handhaben? Die Front-End-Klasse könnte einen Zeiger / Verweis auf eine Klasse implementiert Treiber nehmen (für den entsprechenden Medien-Typen und Lage) und die abstrakten Operationen auf der Arbeitspferd Struktur auszuführen.

Meine Philosophie wäre zu gehen und beide Strukturen an den Client in einer polierten Art und Weise, nur unter der Voraussetzung zugänglich machen würden sie im Tandem eingesetzt werden.

Ich würde so etwas wie eine Referenz QTextDocument in Qt. Sie stellen eine direkte Schnittstelle auf die blanke Metall Datenverarbeitung, sondern die Autorität passieren entlang auf ein Objekt wie ein QTextEdit die Manipulation zu tun.

Beantwortet am 02/08/2008 um 04:00
quelle vom benutzer

stimmen
9

Sie würden eine verschachtelte Klasse verwenden, um eine (kleine) Helper-Klasse zu erstellen, die die Haupt-Klasse zu implementieren erforderlich sind. Oder beispielsweise eine Schnittstelle (eine Klasse mit abstrakten Methoden) zu definieren.

In diesem Fall ist der Hauptnachteil von verschachtelten Klassen, dass dies macht es schwieriger, sie wieder zu verwenden. Vielleicht möchten Sie Ihre Videodecoder-Klasse in einem anderen Projekt verwenden. Wenn Sie es sich um eine verschachtelte Klasse von Videoplayer zu machen, können Sie dies nicht tun, auf elegante Weise.

Stattdessen setzen die anderen Klassen in separaten .h / CPP-Dateien, die Sie dann in Ihrem Videoplayer-Klasse verwenden können. Der Kunde von VideoPlayer- jetzt nur noch die Datei enthält, die VideoPlayer- erklärt, und noch muss nicht darüber wissen, wie Sie es umgesetzt.

Beantwortet am 17/09/2008 um 12:50
quelle vom benutzer

stimmen
5

Eine Möglichkeit, zu entscheiden, ob oder nicht verschachtelte Klassen zu verwenden ist, zu denken, ob diese Klasse spielt eine tragende Rolle oder seinen eigenen Teil.

Wenn es ausschließlich zum Zweck der Unterstützung einer anderen Klasse existiert dann habe ich es in der Regel eine verschachtelte Klasse. Es gibt eine ganze Menge von Einschränkungen zu, dass, scheinen einige davon widersprüchlich, aber es kommt alles auf Erfahrung und Bauchgefühl.

Beantwortet am 05/08/2008 um 09:29
quelle vom benutzer

stimmen
4

Nun, wenn Sie Hinweise auf Ihre Arbeitspferden Klassen in Ihrer Interface-Klasse verwenden, und setzen Sie sie nicht als Parameter oder Rückgabetypen in Ihren Interface-Methoden, werden Sie nicht die Definitionen für diese Arbeitspferde in Ihrer Schnittstelle Header-Datei enthalten müssen (einfach erklären sie nach vorn statt). Auf diese Weise können Benutzer von Ihrer Schnittstelle nicht über die Klassen im Hintergrund wissen müssen.

Sie müssen auf jeden Fall nicht zu nisten Klassen für diese. In der Tat werden separate Klasse-Dateien tatsächlich machen Sie Ihren Code viel besser lesbar und einfacher zu verwalten, wie Ihr Projekt wächst. es wird Ihnen auch später helfen, wenn Sie (sagen für verschiedene Content / Codec-Typen) Unterklasse müssen.

Hier weitere Informationen über die PIMPL Muster (siehe Abschnitt 3.1.1).

Beantwortet am 26/09/2008 um 00:34
quelle vom benutzer

stimmen
4

Wir schlugen ein Problem mit einer halb-alt Sun C ++ Compiler und der Sichtbarkeit von verschachtelten Klassen, die das Verhalten in der Norm geändert. Das ist kein Grund, nicht verschachtelte Klasse zu tun, natürlich, nur etwas bewusst zu sein, wenn Sie auf Ihre Software auf vielen Plattformen, darunter alte Compiler kompiliert wird.

Beantwortet am 21/09/2008 um 01:39
quelle vom benutzer

stimmen
4

Manchmal ist es sinnvoll, die Implementierungsklassen von dem Benutzer zu verstecken - in diesen Fällen ist es besser, sie in einem foo_internal.h setzen als in der öffentlichen Klassendefinition. Auf diese Weise Leser Ihrer foo.h nicht sehen, was Sie würde es vorziehen, sie nicht mit belästigt werden, aber man kann immer noch Tests gegen jeden der konkreten Implementierungen Ihrer Schnittstelle schreiben.

Beantwortet am 16/09/2008 um 10:31
quelle vom benutzer

stimmen
4

Fall klingt wie , wo Sie das nutzen könnten Strategie - Muster

Beantwortet am 05/08/2008 um 09:37
quelle vom benutzer

stimmen
2

Sie sollten nur eine innere Klasse verwenden, wenn Sie es nicht als eigene Klasse implementieren können mit der äußeren Klasse öffentliche Schnittstelle Möchtegern-. Innere Klassen erhöhen die Größe, Komplexität und Verantwortung einer Klasse so sollten sie sparsam verwendet werden.

Ihr Encoder / Decoder - Klasse klingt wie es besser passt die Strategie - Muster

Beantwortet am 18/09/2008 um 16:19
quelle vom benutzer

stimmen
1

Eine andere Sache im Auge zu behalten ist, ob Sie schon einmal verschiedene Implementierungen Ihrer Arbeitsfunktionen (wie zum Beispiel Decodierung und Codierung) vorstellen. In diesem Fall würden Sie auf jeden Fall eine abstrakte Basisklasse mit verschiedenen konkreten Klassen wollen, die die Funktionen implementieren. Es wäre zu nisten eine separate Unterklasse für jede Art der Implementierung nicht wirklich geeignet.

Beantwortet am 23/09/2008 um 20:07
quelle vom benutzer

stimmen
1

Ein Grund , um verschachtelte Klassen zu vermeiden, wenn Sie jemals die Absicht , den Code mit swig (einzuwickeln http://www.swig.org mit anderen Sprachen) zur Verwendung. Swig hat derzeit Probleme mit verschachtelten Klassen, so mit Bibliotheken Schnittstelle , die alle verschachtelten Klassen aussetzen ein echten Schmerzen werden.

Beantwortet am 20/09/2008 um 08:37
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more