В свободное время я создаю довольно большое приложение на основе плагинов, и столкнулся с недостатком дизайна, который останавливал шоу.Мое приложение использует дизайн на основе политик / черт, но поскольку я использую Qt, это делается только через MI (а не через шаблоны и MI).Некоторые из этих классов являются чисто виртуальными, а некоторые выполняют довольно важные функции, которые конечный пользователь никогда не должен касаться.
Моя проблема в том, что некоторые из этих классов требуют сигналов / слотов и, следовательно, являются производными от QObject, нетпроблема, которую я могу просто унаследовать от нее.Однако у меня возникает проблема, когда я хочу получить из класса Qt, а затем расширить его с помощью одной или нескольких моих черт, например:
class Sy_abstractGLViewport : public QGLWidget, public Sy_saveable, public Sy_abstractObject
{
...
}
Здесь QGLWidget получен из QObject, но не виртуально, вызываяпроблемы неоднозначности.
Я рассмотрел шаблон Bridge, где я делаю, например, мой Sy_saveable
чистый виртуальный, а затем извлекаю из него Sy_saveable_imp
, который содержит фактическую реализацию.Затем используйте это для моего Sy_abstractGLViewport
через агрегацию.
Это мне кажется довольно непрофессиональным, потому что приложение основано на плагинах, для моих будущих авторов плагинов это немного PITA, чтобы "подключить" весь интерфейсметоды для агрегированного экземпляра.Я даже не могу автоматизировать его с помощью макросов, потому что конечный пользователь может захотеть переопределить метод.
У кого-нибудь есть шаблон для решения этой проблемы?Или шаблон, который не требует ИМ, но дает мне такую же гибкость?Это мой личный хобби-проект, я не против сделать много рефакторинга - я хочу сделать это право .