c ++中的静态抽象方法

pm1*_*100 21 c++ abstract

我有一个抽象的基类

class IThingy
{
  virtual void method1() = 0;
  virtual void method2() = 0;
};
Run Code Online (Sandbox Code Playgroud)

我想说 - "所有提供具体实例化的类都必须提供这些静态方法"

我很想做

class IThingy
{
  virtual void method1() = 0;
  virtual void method2() = 0;
  static virtual IThingy Factory() = 0;
};
Run Code Online (Sandbox Code Playgroud)

我知道没有编译,无论如何它还不清楚如何使用它,即使它编译.无论如何我只能这样做

Concrete::Factory(); // concrete is implementation of ITHingy
Run Code Online (Sandbox Code Playgroud)

根本没有在基类中提到工厂.

但我觉得应该有一些表达我希望实现注册的合同的方式.

这有一个众所周知的习语吗?或者我只是把它放在评论中?也许我不应该试图强迫这个

编辑:当我输入问题时,我觉得自己模糊不清.我觉得应该有一些方法来表达它.伊戈尔给出了一个优雅的答案,但实际上它表明它确实无济于事.我最终还是要做

   IThingy *p;
    if(..)
       p = new Cl1();
    else if(..)
       p = new Cl2();
    else if(..)
       p = new Cl3();
    etc.
Run Code Online (Sandbox Code Playgroud)

我想像c#,python或java这样的反射语言可以提供更好的解决方案

Igo*_*aka 32

您遇到的问题部分与轻微违反单一责任原则有关.您试图通过界面强制执行对象创建.接口应该更纯粹,并且只包含与接口应该做的不可分割的方法.

相反,您可以从界面中获取创建(所需virtual static方法)并将其放入工厂类中.

这是一个简单的工厂实现,它强制在派生类上使用工厂方法.

template <class TClass, class TInterface>
class Factory {
public:
    static TInterface* Create(){return TClass::CreateInternal();}
};

struct IThingy {
    virtual void Method1() = 0;
};

class Thingy : 
    public Factory<Thingy, IThingy>,
    public IThingy {
        //Note the private constructor, forces creation through a factory method
        Thingy(){}
public:
        virtual void Method1(){}
        //Actual factory method that performs work.
        static Thingy* CreateInternal() {return new Thingy();}
};
Run Code Online (Sandbox Code Playgroud)

用法:

//Thingy thingy; //error C2248: 'Thingy::Thingy' : cannot access private member declared in class 'Thingy'

IThingy* ithingy = Thingy::Create(); //OK
Run Code Online (Sandbox Code Playgroud)

通过derinving Factory<TClass, TInterface>,派生类被编译器强制拥有CreateInternal方法.没有定义它会导致这样的错误:

错误C2039:'CreateInternal':不是'Thingy'的成员