3

ファクトリ メソッドを使用して派生クラスを返そうとしていますが、戻り値の型は基本クラスの型です。私の理解では、継承によってこれが可能になると思っていましたが、明らかに間違っています。

WeightExercise と CardioExercise は、どちらも Exercise から派生したものです。

オブジェクトをキャストすることはできましたが、私のデザインではそうする必要はないと考えていました。誰かが私の間違いを指摘できますか?

主要

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

ファクトリから返された派生クラスを基本クラス 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

メイン メソッドでは、次のようになります。

WeightExercise *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection);

これであるべき

Exercise *WeightExerciseObj = ExerciseFactoryObj.createExercise(menuselection);

WeightExercise を使用することはできません。返される特定のタイプのエクササイズがわからないためです。CardioExercise または WeightExercise、またはまだ認識していないその他の将来のタイプである可能性があります。

于 2012-06-30T12:27:31.957 に答える