Problem mit Mehrfachvererbung



  • Hallo,

    ich arbeite gerade an einer GUI Library die mir die Arbeit mit WindowApplications erleichtern soll.
    Das soll natürlich alles komplett ObjektOrientiert sein.
    Nun habe mehrere Klassen wie "IWindow", "IGadget". Diese beiden Klassen sollen später einige Funktionen haben, die exakt das gleiche machen. z.B. "SetPosition()". Damit ich solche Funktionen nicht immer wieder schreiben bzw. kopieren muss - das wäre ja sonst unschön - möchte ich das für eine Unter-Klasse machen.
    Das ist ja noch sehr leicht, allerdings habe ich das alles mit "I"-Klassen, also Interfaces gemacht. Die eigentlichen Win32API oder X11 Funktionen werden in den "C"-Klassen aufgerufen. Das hat verschiedene Gründe warum ich das mache.
    Das heißt das sieht das grob so aus:

    // Basic sub-class
    
    class IBasicObject
    {
        public:
            virtual void SetPosition(int X, int Y) = 0;
    };
    
    // Interface classes
    
    class IWindow : public IBasicObject
    {
        public:
            virtual void Minimize(); // Function only for windows
    };
    
    class IController : public IBasicObject
    {
        public:
            virtual void SetState(); // Function only for controllers
    };
    
    // Final used classes:
    
    class API CWindow : public IWindow
    {
        public:
            void SetPosition(int X, int Y);
            void Minimize();
        private:
            HWND Handle;
    };
    
    class API CController : public Controller
    {
        public:
            void SetPosition(int Y, int Y); // redundant
            void SetState();
        private:
            HWND Handle; // redundant
    };
    
    // Program ( int main() { ... )
    
    IWindow* MyWindow = new CWindow();
    IController* MyButton = new CController();
    

    Nun will ich eine weitere Klasse Namens "CBasicObject" erstellen die wie folgt aussieht:

    class API CBasicObject : public IBasicObject
    {
        public:
            void SetPosition();
        protected:
            HWND Handle;
    };
    
    class API CWindow : public CBasicObject, public IWindow
    {
        ...
    };
    

    Das Problem ist aber jetzt, dass IBasicObject zwei mal aufgerufen wird.
    Einmal in CBasicObject und ein mal in IWindow.

    Wie kann ich das am besten machen, dass ich Funktionen wie "SetPosition" und Komponenten wie "HWND Handle" nur einmal programmieren muss??



  • Ich gehe mit einer ähnlichen Struktur in meinem 2D-Spiel.
    Allerdings vermeide ich gezielt Mehrfachvererbung, also dass eine Klasse von mehreren Klassen erbt.
    Aber ich würde einfach alles aus BasisObject werfen was nicht mehrfach vorkommen darf und das dann in einem anderen Interface unterbringen und nur einmal vererben an die Interface-Klassen die das brauchen.
    Mehrfacherbung sollte man immer vermeiden.
    rya.


Anmelden zum Antworten