Klasseninteraktion
-
hallöchen
wie könnte man diese beiden klassen am besten verknüpfen (d.h, KlasseA soll auf funktionen von KlasseB zugreifen). CApp hat hierbei beide Klassen als Member.
|----------| |----------| | CApp |<-----| CKlasseB | |----------| |----------| /\ / | / | / | / ??? | / |----------| / | CKlasseA |/ |----------|
ich dachte am besten wäre es, für klasseB ein Singleton zu verwenden(Klasse B soll sowieso nur eine Instanz haben). Jedoch ist dann KlasseB ja an sich ähnlich einer globalen varible/Klasse, was mir eigendlich nicht so gefällt (oder versteh ich den Singleton pattern falsch?)
Eine Alternative wäre es, dass man klasseA beim ertellen einen Zeiger auf KlasseB mitgibt, jedoch wäre es unschön, wenn man z.B, dann noch klasse C,D,E,F, usw. hätte, man hätte ja ne riesige parameterliste, und beim Erweitern/Warten müsste man dan jedesmal da was daran ändern.
Als dritte möglichkeit sehe ich, das man einfach beim Erstellen von Klasse A einen Zeiger von CApp mitgibt, damit Klasse A dann so z.B. auf eine Funktion aufrufen kann:m_pApp->GetKlasseB()->TueEtwas();
bzw. m_pApp->m_KlasseB->TueEtwas();wie entwirft man solche verknüpfungen am besten eurer Meinung nach?
gruss
Horst
-
wie wäre es wenn klasseB von klasseA erbt?
-
Nö, das ergäbe keinen oft Sinn. (z.B. ließt KlasseB irgendetwas aus der Regestry und KlasseA will halt für einen bestimmten Schlüssel Daten haben). Und das würde auch nicht klappen, wenn B auch auf A zugreifen will.
-
Hilft friend vieleicht?
-
Eine Alternative wäre es, dass man klasseA beim ertellen einen Zeiger auf KlasseB mitgibt
Das ist eine gute Lösung. Andere gängige Alternativen:
1. Containment: KlasseA enthält ein Objekt der KlasseB als Member. Falls CApp nicht auf die Dienste von KlasseB angewiesen ist (was sie nicht sollte), dann hat das den Vorteil, dass CApp nur noch eine Klasse (nämlich KlasseA) enthalten muss.2. KlasseA erzeugt sich lokal ein Objekt der KlasseB.
3. Methoden von KlasseA die Dienste von KlasseB in Anspruch nehmen wollen, erhalten einen Parameter vom Typ KlasseB.
jedoch wäre es unschön, wenn man z.B, dann noch klasse C,D,E,F,
Eine Klasse die mit sovielen anderen Klassen kollaboriert ist immer etwas unschön. Egal ob du diese nun als Singletons (die mal letztlich als implizite Parameter betrachten kann) implementierst oder direkt übergibst. Wobei die Singleton-Variante sogar noch starrer ist, da die Kopplung höher ist. Du kannst z.B. dann nicht so einfach auf Interfaces umsteigen und damit den konkreten Typ variieren. In so einer Situation stellt sich aber die Frage ob KlasseA nicht lieber mit einer Klasse auf höherem Abstraktionslevel kollaborieren sollte statt mit den vielen Klassen auf niedrigerer Ebene.
wie entwirft man solche verknüpfungen am besten eurer Meinung nach?
Das ist natürlich Kontextabhängig. Im Allgemeinen würde ich sagen:
Containment, Benutzung, Assoziation, Vererbung. In dieser Reihenfolge.Es würde wahrscheinlich helfen, wenn du mal beschreiben würdest, welche Aufgaben deine drei Klassen haben.