Designfrage - polymorfriend???



  • Hi!

    Vielleicht wisst ihr eine saubere und schnelle Lösung für folgendes Problem:
    Ich entwickle ein kleines Framework, das in sich abgeschlossen ist und möglichst simpel bleiben sollte. Die eigentliche Anwendung wird nicht mit dem User interagieren, sie rechnet nur. Nun will ich aber eine Schnittstelle anbieten, über die parallel zur Rechnung möglichst alle internen Zustände visualisiert werden können. Die Visualisierung soll dabei die eigentlichen Algorithmen und Klasseninterfaces möglichst wenig stören, sie ist nur optional und für die Anwendung irrelevant.

    Meine beste Idee hierfür war die folgende: Die Basisklassen meiner Anwendung rufen an bestimmten Punkten die Methoden einer Visualisierung (abstrakt). Diese ist Friend-Klasse aller wichtigen Basisklassen UND Implementierungsklassen. So kann die Visualisierung alle Attribute aller Instanzen und somit den Zustand des gesamten Systems "einsehen", ohne das dafür irgend ein Eingriff in die eigentliche Klassenhierarchie des Systems nötig war und ohne, dass irgendwelche Schnittstellen (eigens für die möglichst transparente Visualisierung!) aufgebohrt werden mussten.

    Der Haken ist nur der folgende: Meine Visualisierung ist abstrakt, und auch einige Klassen meines Systems. Das Framework wird (von anderen) genutzt, indem abstrakte Schnittstellen implementiert werden. Da sich aber die verdammte friend-Beziehung bei keinem der beiden Partner vererbt, ist diese eigentlich so unschöne Methode nicht die Lösung meines Problems, obwohl das vielleicht DIE friend-Musteranwendung geworden wäre.

    Gibt es irgend einen Trick, wie man die friend-Beziehung vererbt???
    Hat jemand eine andere Lösung für meine Designfrage?

    Danke euch!!



  • Riecht doch eigentlich sehr nach Plugin Design oder ?

    Devil



  • Für mich hört sich das irgendwie so an:

    // Abstraktes Visualisierungsinterface
    
    class WindowInterface {
    public:
      virtual void buttonCalc() = 0;
      // ...
    };
    
    // Implementationsklassen bzw. deine Berechnungsklassen
    class Implementation {
    // ...
    };
    
    // dann zusammenkleistern
    
    class Window : public WindowInterface, protected Implementation {
    // Hier kannst du deine virtual-Methoden kram regeln
    };
    

    Oder hab ich alles komplett falsch verstanden


Anmelden zum Antworten