У меня есть абстрактный базовый класс
class IThingy
{
virtual void method1() = 0;
virtual void method2() = 0;
};
Я хочу сказать - «все классы, обеспечивающие конкретную реализацию, должны также предоставлять эти статические методы»
Мне хочется сделать
class IThingy
{
virtual void method1() = 0;
virtual void method2() = 0;
static virtual IThingy Factory() = 0;
};
Я знаю, что не компилируется, и в любом случае не ясно, как его использовать, даже если он компилировался. И в любом случае я могу просто сделать
Concrete::Factory(); // concrete is implementation of ITHingy
вообще без упоминания Фабрики в базовом классе.
Но я чувствую, что должен быть какой-то способ выражения контракта, на который я хочу подписать реализации.
Есть ли известная идиома для этого? Или я просто оставлю это в комментариях? Может быть, я не должен пытаться заставить это все равно
Редактировать: я чувствовал себя расплывчатым, когда набирал вопрос. Я просто чувствовал, что должен быть какой-то способ выразить это. Игорь дает элегантный ответ, но на самом деле это показывает, что на самом деле это не помогает. Я все еще вынужден делать
IThingy *p;
if(..)
p = new Cl1();
else if(..)
p = new Cl2();
else if(..)
p = new Cl3();
etc.
Я думаю, что отражающие языки, такие как c #, python или java, могли бы предложить лучшее решение