我有一个抽象的基类
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'的成员
| 归档时间: |
|
| 查看次数: |
20421 次 |
| 最近记录: |