我有一个抽象类Engine3D,它的结构(Vector3D等)在头文件中。
现在,我有该类的实现,ConcreteEngine3D : Engine3D. 此外,我还有其他类似的类ConcreteVector3D : Vector3D具有将在内部使用的其他成员和方法ConcreteEngine3D(为了这个示例,假设它是float lengthand calculateLength())。
在 main.cpp 我有代码:
#include "ConcreteEngine3D.h"
Engine3D * engine;
...
int main(){
engine = new ConcreteEngine3D();
Vector3D* vector = new Vector3D(engine, 10, 5, 2);
}
我希望变量vector是 type ConcreteVector3D*。
我将需要该类型ConcreteEngine3D,但在 main.cpp 中,我什至不应该知道它是那种类型,也不必使用扩展字段,如length. 另外,我不能在 main.cpp 中使用任何具体来自 ConcreteEngine3D.h(仅 Engine3D.h)的东西 - 这是为了灵活,更改实现必须意味着仅更改包含和符合new ConcreteEngine3D().
我不想修改上面的代码或Engine3D.
在我的构造函数中,Vector3D我总是放置一个指向Engine3D对象的指针(我在这里给出ConcreteEngine3D类型)。
也许我可以在构造函数中做些什么Vector3D来改变它的类型?
例如Vector3D* Engine3D::convert(Vector3D v)在构造函数内部调用,它将继承自Engine3Din ConcreteEngine3D(它创建一个ConcreteVector3D带有字段的新对象Vector3D并返回它)。
当然,该代码不起作用:
Vector3D::Vector3D(Engine3D *engine){
//how to 'return' or 'convert' the type to the one that returns engine->convert(this);
}
所以基本上,我想得到下面代码的效果,但没有vector = engine->convert(vector)or行Vector3D* vector2 = new ConcreteVector3D(engine, 10, 5, 2)。
#include "ConcreteEngine3D.h"
Engine3D * engine;
...
int main(){
engine = new ConcreteEngine3D();
Vector3D* vector = new Vector3D(engine, 10, 5, 2); //produces Vector3D, not ConcreteVector3D
vector = engine->convert(vector); //cannot be here! but creates the right object
Vector3D* vector2 = new ConcreteVector3D(engine, 10, 5, 2); //also creates rights object, but cannot be here!
}
另外,我不想在Engine3Dor中使用工厂ConcreteEngine3D。我想允许“用户”Vector3D按照我在第一个代码中编写的方式创建。