Designproblem
-
Hi, ich habe ein Problem beim design meiner Klassenstruktur für ein Programm.
Hier mal das Problem:
Also ich schreibe eine DLL mit der ich 2DBitmaps und Texte anzeigen kann.
Für beide habe ich eine Klasse (CBitmap, CFont).Beide basieren auf ein 2D Koordinatensystem (C2D) diese Hauptklasse speichert Koordinaten und bietet Funktionen um zu Rotieren und zu bewegen.
CBitmap und CFont erben beide von dieser Klasse.
Zusatzlich erben sie noch von einer Interfaceclasse mit der von aussen das Bitmap oder der Text genutzt werden kann.
Hier der Code:
class C2D { ... void Move() {...} ... } class IBitmap { ... virtual void Move() = 0; ... } class IFont { ... virtual void Move() = 0; ... } class CBitmap : public C2D, IBitmap { ... void Move() { C2D::Move(); } ... } class CFont : public C2D, IFont { ... void Move() { C2D::Move(); } ... }
Ok das ist ja alles kein Problem aber das kommpt jetzt:
Also ich möchte jetzt eine neue Funktion machen mit der ich von aussen (ich kenne dort nur die Interfaces) zwei sachen verbinden kann. d.h. dass ich irgentwei einen Zeiger an eine Funktion übergebe und das dieser dann zurückgerechnet wird zu C2D damit ich z.b. die Funktionen einer C2D in einer anderen C2D aufrufen kann.
Also ich möchte über die Interfaces irgentwie einer C2D Instance zb. einem Bitmap einen zeigen auf einer anderen C2D Instancce übergeben.
Das Problem ist halt das das mit ner Funktin aus den Interfaceklassen klappen soll und ich ja auch nur zeigen auf die Klassen habe.
Dabei ist es egal ob ich neue Klassen machen muss oder neue interfaces oder so hauptsache es klappt irgentwei und die C... Teile dürfen nicht nahc aussen bekannt sein (also in den Interfaces als Parameter nutzen).
Danke ich hoffe das versteht einer weil ich das schon seit fast 1.5Jahren versuche und nicht hinbekomme und mich immer drum gedrückt habe doch jetzt muss das einfach irgentwei klappen.
-
Wenn du dich schon so lange damit beschäftigst solltest du Zeit dafür haben, dein Problem verständlich zu erörtern
mfg
Glamdring
-
Was verstehst du den nicht?
Das ist übrigens auch ein Problem das ich zwar weiss wie es sein soll aber ich kanns einfach nicht einfach erklären.
GANZ grob man kann über zwei Interfaceklassen die og Dinge machen zb das Bitmap drehen, Fonttext ändern etc. und nun soll man zb. pBitmap->Connect(pFont) machen können und dann soll irgnetwie in eine VAriable in der C2D Instance des Bitmaps ein Zeiger auf die C2D Instance der Font kommen.
Dabei müssen warscheinlich IBitmap und IFont nochmal von einer gemeinsamen Klasse abgeleitet sein.
-
Weis keiner wie ich das meine oder soll ich mal Code den ich schon mal hatte posten? (funktionierte nur nie richtig)
-
Ich hab keine Ahnung was du meinst...
Newbie schrieb:
Dabei müssen warscheinlich IBitmap und IFont nochmal von einer gemeinsamen Klasse abgeleitet sein.
Das Design schreit IMHO nach einer Moveable Klasse
-
Mit fällt dazu dass Kompositionsmuster ein, so wie es in Pattern-Hatching (Im Dateisystem) verwendet wird.
mfg
Glamdring
-
Ok also mann kann dan ja I2D machen und dass dann so ändern:
class I2D { ... virtual void Move() = 0; ... } class IBitmap : public I2D { ... virtual void Move() = 0; ... } class IFont : public I2D { ... virtual void Move() = 0; ... }
Aber wie komme ich dann von I2D nach C2D mit casts klappt das irgentwie nicht richtig und führ zu komischen resultaten bzw abstürzen.
@Glamdrink könntest du mir einen link geben wo ich das finde oder ein kurzes beispiel psoten da ich zu Kompositionsmuster + Pattern-Hatching nichts brauchbares finde.
Danke
-
Äh, hab mich vertan, es ging dabei um das Proxy-Muster:
Er hatte eine Oberklasse für alle Dateien, von dieser Klasse erbten zwei Klassen, die Ordner und Dateien darstellen. Die Ordnerklasse beinhaltet Dateien (Das ist das Kompositionsmuster). Dann möchte er noch Verknüpfungen in das System einfügen, das macht er mit dem Proxy-Muster. Dazu hat er noch eine weitere Subklasse gebildet, die alle Aufrufe an die Klasse weiterleitet, auf die sie verlinkt. (Is ne Mischung aus Proxy und Dekorierer)mfg
Glamdring
-
@_Newbie_:
Wieso willst du denn von I2D nach C2D?
Man sollte solche Casts möglich vermeiden und ich sehe auch hier keinen Anwendungszweck, kannst du das genauer erläutern?MfG MAV
-
Ok also ic möchte eine Funktion Connect einbauen.
Diese Funktion soll bewirken das zwei Objecte verbunden werden (zb. die Font immer im Bitmap angezeigt wird[das ist jedoch nicht das eizige ich brauche diese konstruktion für mehrere sachen])
Das Problem ist das die Datenstruktur (hier zb D3DXVECTOR) in der das gespeichert wird nicht im Interface auftaucht.
Daher muss eine Instance von C2D (in der der eigentlich Renderbefehl ist) auf Daten einer Anderen C2D Instance zugreiffen können ohne das ich sie umständlich über die Interfaces mitschleiffe (Das geht zwar aber da ich das für einige weitere Funktionen brauche habe ich nachher einen ganzen wuss an funktionen die sogar dur unsachgemässem aufruf von aussen das ganze Programm craschen)
Wie kann ich zwischen sochen zweihen nun informationen aufrufen bzw es würde ja reichen irgentwei einen gültigen zeiger der anderen C2D Instance zu bekommen.
Nur das bekomme ich nicht hin mit Cast sollte das ja möglich sein jedoch ist hier das Problem das es zwei 'Castwege' I2D->IBitmap->CBitmap->C2D und I2D->IFont->CFont->C2D gibt die mir das irgentwei kaputmachen, soweit ich das verstanden habe. Die Castversuche sind bei mir auch immer mit ausnahmefehlern gescheitert.