Обработка зависимостей между образцами мостов - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь разработать простую настольную игру, которая должна работать с различными библиотеками графического интерфейса, которые можно изменять во время выполнения. Идея состоит в том, что я хочу иметь несколько классов, каждый из которых имеет объект изображения, представляющий объекты этого класса. Но так как каждая библиотека выбирает обертывание изображений в классах, которые являются специфическими для этой библиотеки, я должен написать иерархию моста, чтобы абстрагировать любые особенности реализации. Как то так

class myImageInt{
    // common pure virtual methods that I want my image implementation to define
}

class myImageImpA : myImageInt{
    libAImg img;
    libAImg getLibraryImp(){ return img;}
// provide definition for common interface in terms of libAImg functions
}

class myImageImpB: myImageInt{
    libBImg img;
    libBImg getLibraryImp(){ return img;}
// provide definition for common interface in terms of libBImg functions
}

И тогда мне, конечно, также придется использовать иерархию мостов для типов библиотек, которые фактически будут обрабатывать управление окнами и рисование

class myScreenInt{
     void drawImage(myImageInt& img) = 0;
// common methods for drawing onto a window
}

class myScreenImpA : myScreenint{
    libAScreen scrn;
    void drawImage(myImageInt& img){
    // pass the actual library specific object to the libAScreen  so that the image can be drawn
    }
// provide definition for common interface in terms of libAScreen functions
}

class myScreenImpB : myScreenint{
    libBScreen scrn;
   void drawImage(myImageInt& img){
       // pass the actual library specific object to the libBScreen  so that the image can be drawn
   }
// provide definition for common interface in terms of libBScreen functions
}

Но проблема в том, что для того, чтобы нарисовать изображение в окне, мне нужно будет вызвать метод drawImage для одного из scrn объектов, и эти объекты нуждаются в объектах изображения для их конкретной реализации (т.е. объекты типа libAImg и LibBImg). В любом случае можно ли достичь этой формы независимости библиотеки, не приводя к небезопасному типу static_cast или дорогостоящему dynamic_cast, чтобы отбросить дерево наследования и вызвать метод getLibraryImp с типом возврата, специфичным для этого реализация?

    void myScreenImpA::drawImage(myImageInt& img){
      scrn.drawImage(static_cast<myImageImplA&>(img).getImpl()); //type unsafe cast
   }
...