Designfrage für versch. Frameworks



  • Hallo!

    Angenommen ich hab meine eigene Klasse, nennen wir sie "Color". Sie kann alles, was eine Farbklasse so kann, z.B. kann man Red Green und Blue setzen.
    Diese Klasse will ich jetzt je nach Projekt mit unterschiedlichen Frameworks verwenden, z.B. DirectX oder OpenCv.

    Diese haben ihre eigenen Color-Klassen. Wie spendiert man der Color-Klasse nun eine Konvertierungsmöglichkeit. Sowas wie "ConvertToOpenCvColor" o.ä. wäre Mist, weil man dann ja immer zumindest die entsprechenden Headerdateien des Frameworks haben müsste, auch wenn man's nicht benutzt.

    Erbt man in diesem Fall tatsächlich (DxColor) implementiert dort eine neue Methode? Geht das über Templates?



  • Deesigner schrieb:

    Diese haben ihre eigenen Color-Klassen. Wie spendiert man der Color-Klasse nun eine Konvertierungsmöglichkeit. Sowas wie "ConvertToOpenCvColor" o.ä. wäre Mist, weil man dann ja immer zumindest die entsprechenden Headerdateien des Frameworks haben müsste, auch wenn man's nicht benutzt.

    Die Headerdateien muss man hier erst in der .cpp-Datei einbinden.

    // ================== Color.hpp ==================
    class OpenCV_Color;
    
    class Color
    {
        public:
            OpenCV_Color ConvertToOpenCvColor() const;
    };
    
    // ================== Color.cpp ==================
    #include "Color.hpp"
    #include <OpenCV/Color.h>
    
    OpenCV_Color Color::ConvertToOpenCvColor() const
    {
        // ...
    }
    

    Du kannst also zum Beispiel die Bibliotheken mit dem Code der .cpp-Datei ausliefern. Oder wenn du den User selbst rekompilieren lassen möchtest, kannst du mit bedingter Kompilierung unbenötigte Definitionen ausschliessen.



  • Ich glaube, er meinte eher, wie man das vom Design schön löst.

    Ich würde meine Color-Klasse ganz normal schreiben und dann einfach ableiten.

    class Color
    {
     // Ganz "normale" Klasse
    };
    

    Verwendung für anderes Framework:

    class ColorCv : public Color
    {
     // Benötige Funktionen um sie kompatibel zu machen. 
    };
    

    Man könnte dies auch über Komposition lösen:

    class ColorCv
    {
     private:
      Color mColor;
    
     public:
      // Convert-Zeugs
    };
    


  • Ich weiss nicht, ob sich eine weitere Klasse als Schnittstelle zwischen der eigenen Color und der externen ColorCv lohnt.

    Meinen Ansatz finde ich übrigens auch nicht so gut, da er die eigene Color -Klasse abhängig macht. Falls nicht gleich implizite Konvertierungsmöglichkeiten erwünscht sind, fände ich die eleganteste Lösung, entsprechende globale Konvertierungsfunktionen einzurichten. Diese könnte man separat einbinden und somit wäre auch bereits geklärt, was zu tun ist, wenn deren Funktionalität nicht benötigt wird.

    ColorCv ToColorCV(const Color&   col);
    Color   ToMyColor(const ColorCv& col);
    


  • Nexus schrieb:

    Ich weiss nicht, ob sich eine weitere Klasse als Schnittstelle zwischen der eigenen Color und der externen ColorCv lohnt.

    Meinen Ansatz finde ich übrigens auch nicht so gut, da er die eigene Color -Klasse abhängig macht. Falls nicht gleich implizite Konvertierungsmöglichkeiten erwünscht sind, fände ich die eleganteste Lösung, entsprechende globale Konvertierungsfunktionen einzurichten. Diese könnte man separat einbinden und somit wäre auch bereits geklärt, was zu tun ist, wenn deren Funktionalität nicht benötigt wird.

    ColorCv ToColorCV(const Color&   col);
    Color   ToMyColor(const ColorCv& col);
    

    das hatte ich so jetzt auch als beste Lösung gesehen. Entsprechende Header einbinden und fertig 🙂 so ein problem ist allerdings sicher auch nicht neu


Anmelden zum Antworten