Я пытаюсь разработать простую настольную игру, которая должна работать с различными библиотеками GUI, которые можно изменять во время выполнения. Идея состоит в том, что я хочу иметь несколько классов, каждый из которых имеет объект изображения, представляющий объекты этого класса. Но поскольку каждая библиотека выбирает обтекание изображений в классах, специфичных для этой библиотеки, я должен написать мостовую иерархию, чтобы абстрагировать любые особенности реализации. Что-то вроде этого
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
}
Задача ещё не решена.
Других решений пока нет …