Другой подход заключается в том, что у вас есть несколько интерфейсов I, J, K и чистые методы в A, такие как GetI (), которые возвращают указатели на этот интерфейс.
Тогда все ваши классы реализации реализуют A, плюс любыедругие интерфейсы плюс любой из методов GetX ().
Ваш интерфейс - это A, I, J, K, и это все, что раскрывается. Это все, что нужно высмеивать.
В конечном счете, постоянное обновление A для добавления новых классов становится утомительным, поэтому вы вкладываете средства в другой механизм получения интерфейсов, вероятно, на основе токена, объявленного в интерфейсе. класс и метод шаблона в A, который разрешает токен и тип возврата, вызывая метод реализации, который делает то же самое. Или вы просто сдаетесь и пропускаете вызывающий номер dynamic_cast для интерфейсов.
Вскоре вы получите COM или что-то очень похожее.
class A;
{
virtual String Identify() = 0;
virtual I* GetI() { return nullptr;}
virtual J* GetJ() { return nullptr;}
virtual K* GetK() { return nullptr;}
};
class I
{
virtual void Work() =0;
};
class J
{
virtual void MoreWork() =0;
};
class B: A, I
{
void Work() {}
I* GetI() { return this;}
};
class C: A, J
{
void MoreWork() {}
I* GetJ() { return this;}
};