我有一个抽象类Engine3D
,它的结构(Vector3D
等)在头文件中。
现在,我有该类的实现,ConcreteEngine3D : Engine3D
. 此外,我还有其他类似的类ConcreteVector3D : Vector3D
具有将在内部使用的其他成员和方法ConcreteEngine3D
(为了这个示例,假设它是float length
and 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)
在构造函数内部调用,它将继承自Engine3D
in 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!
}
另外,我不想在Engine3D
or中使用工厂ConcreteEngine3D
。我想允许“用户”Vector3D
按照我在第一个代码中编写的方式创建。