3

我正在尝试使用工厂方法返回派生类,但返回类型是基类类型。根据我的理解,我认为继承可以让我这样做,显然我错了。

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;
}
}
4

2 回答 2

8

您可以将从工厂返回的 Derived 类分配给基类 one :

ExerciseFactory ExerciseFactoryObj;
Exercice *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection);

编辑:

如果您确实需要访问 WeightExerciceObject 元素,请使用:

WeightExerciceObject * weight = dynamic_cast<WeightExerciceObject *>(ExerciseFactoryObj.createExercise(menuselection));

如果类不是确切的类,这将返回 NULL。您需要检查 NULL。

于 2012-06-30T12:25:46.643 回答
1

在 main 方法中,这是:

WeightExercise *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection);

应该是这个

Exercise *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection);

您不能使用 WeightExercise,因为您不知道返回的是什么特定类型的锻炼,它可能是 CardioExercise 或 WeightExercise,或者您还不知道的其他未来类型。

于 2012-06-30T12:27:31.957 回答