У меня есть чистый виртуальный класс A, на котором я делаю
Q_DECLARE_INTERFACE(A, "org.something.A")
и у меня есть плагин, реализованный как класс B, который наследует A и QObject, имеет интерфейс A и реализует все чисто виртуальные методы A
class B : public QObject, public A
{
Q_OBJECT
Q_INTERFACES(A)
public:
void someMethod();
}
и в cpp:
Q_EXPORT_PLUGIN2(A, A)
Это хорошо работает. В действительности существует много различных интерфейсов, и основное приложение (которое я не написал и на котором я не могу делать большие модификации) вызывает
qobject_cast<A *>(bPointer);
и проверяет результат, чтобы узнать, реализует ли определенный плагин интерфейс.
Все это работает очень хорошо.
Как бы то ни было, я бы хотел, чтобы в классе B во время выполнения определялся, хочу ли я реализовать определенный интерфейс.
Методы всегда будут реализованы, но я бы хотел иногда вызывать сбой qobject_cast, но определяемый во время выполнения (один экземпляр всегда будет сбой или успешным для одного и того же интерфейса).
Это может звучать странно, но причина этого в том, что я хотел бы добавить плагины Python (или других языков). У них будет оболочка C ++. Их исходный код на python будет храниться с использованием файла rcc. Код C ++ должен быть одинаковым для всех плагинов Python.
Оболочка c ++ будет вызывать метод python, чтобы определить, какие интерфейсы реализованы кодом python, и вызвать сбой qobject_cast, если код python не реализуется для интерфейса.
Класс-оболочка C ++ будет реализовывать все интерфейсные методы и перенаправлять вызов в python, но на самом деле будут вызываться только те, которые были успешно преобразованы.
Это может быть осуществимо путем переопределения мета-связанных методов QObject, но я не знаю, какие именно.
Надеюсь, вы понимаете, что я пытаюсь сделать (хотя это не очень понятно). Может быть, есть совершенно другой способ сделать это?
Спасибо