我正在开发一个api,它在运行时决定使用哪个更高级别的api,我有很多抽象类,每个高级api的派生类,以及一个为我提供正确派生类的上下文类对于这项工作,使用一个函数(例如):
Mesh* genMesh(data d) { if(m_useA_API) return new A_mesh(d); else return B_mesh(d); }
像这样的东西,现在问题是,是否有可能使代码不那么难看?而不是在上下文类中使用方法,我可以覆盖基类中的new运算符来返回相应的派生类实例吗?
如果没有,有哪些可能的解决方案?
tl;博士这是我想做的事情
Mesh* m = new Mesh(data); // and the base class decides which derived class to use instead of the Context class.
感谢。
答案 0 :(得分:0)
您不能将new
用作工厂,但可以使用实施模式:
class Mesh {
std::unique_ptr<MeshImpl> _impl;
public:
Mesh(int data)
: _impl(
m_use_A_API
? new A_mesh(data)
: new B_mesh(data)
) {
}
MeshImpl& get_value() { return *_impl; }
};
类A_mesh
,B_mesh
是继承自类MeshImpl
的不同类,将以正确的方式初始化;
或者您可以通过下一种方式改进您的工厂代码:
在类genMesh(int)
Mesh
将Mesh
的构造函数设为私有,以确保没有人直接调用它。