У меня есть абстрактный базовый класс
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
без упоминания Factory в базовом классе вообще.
Но я чувствую, что должен быть какой-то способ выражения контракта, который я хочу, чтобы реализации подписывались.
Есть ли известная идиома для этого? Или я просто помещаю его в комментарии? Может быть, я не должен пытаться это сделать в любом случае
Редактировать: я мог чувствовать себя туманным, когда я набрал вопрос. Я просто чувствовал, что должен быть какой-то способ выразить это. Игорь дает элегантный ответ, но на самом деле он показывает, что на самом деле это не помогает. Мне все еще приходится делать
IThingy *p;
if(..)
p = new Cl1();
else if(..)
p = new Cl2();
else if(..)
p = new Cl3();
etc.
Я думаю, что отражающие языки, такие как С#, python или java, могут предложить лучшее решение