我正在尝试使用工厂方法返回派生类,但返回类型是基类类型。根据我的理解,我认为继承会让我这样做,显然我错了。
WeightExercise和CardioExercise都来自练习。
我可以施放物体,但我认为我的设计意味着我不必这样做。有人可以指出我的错误吗?
主要
ExerciseFactory ExerciseFactoryObj;
WeightExercise *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection);
工厂类
class ExerciseFactory
{
public:
ExerciseFactory();
~ExerciseFactory();
Exercise* createExercise(int exercisetype);
private:
static WeightExercise* createWeightExercise() { return new WeightExercise(); }
static CardioExercise* createCardioExercise() { return new CardioExercise(); }
};
工厂实施
Exercise* ExerciseFactory::createExercise(int exercisetype)
{
if ( 1 == exercisetype )
{
return this->createWeightExercise();
}
else if ( 2 == exercisetype )
{
return this->createCardioExercise();
}
else
{
cout << "Error: No exercise type match" << endl;
}
}
答案 0 :(得分:6)
您可以将从工厂返回的派生类分配给基类1:
ExerciseFactory ExerciseFactoryObj;
Exercice *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection);
<强>编辑:强>
如果您确实需要访问WeightExerciceObject元素,请使用:
WeightExerciceObject * weight = dynamic_cast<WeightExerciceObject *>(ExerciseFactoryObj.createExercise(menuselection));
如果类不是确切的类,则返回NULL。您需要检查NULL。
答案 1 :(得分:1)
在主要方法中,这个:
WeightExercise *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection);
应该是这个
Exercise *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection);
你不能使用WeightExercise,因为你不知道返回什么特定类型的运动,可能是CardioExercise或WeightExercise,或者你还没有其他类型的未来类型意识到了。