0

昨夜、オブジェクト ファクトリを設計しているときに困惑に遭遇したので、ここでガイダンスを求めようと思いました。

基本的に、私の「CameraFactory」は、「FIXED」や「FREE」などの使用可能なタイプに基づいてクラスへのポインターを返します (その他の例もありますが、この例は短くします)。これらはすべて CameraBase を継承しています。ただし、私の問題は、 CameraBase クラスの実装が非常に限られているため、ユーザーstatic_cast<typeOfCameraRequested*>(returned CameraBaseDerivative*);は返されたポインターに対して a を実行する必要があることです。

ユーザーに静的キャストを「覚えておく」ように強制することで、結果は悪い習慣だと思います(実際の実装では生のポインターを使用していません)。しかし、私の理解では、「きちんとした」ファクトリ実装を作成する他の唯一の方法は、CameraBase の派生クラスのすべてのメンバー/メソッドへのインターフェイスを含めて、派生物を簡単に呼び出すことができるようにすることです。

誰かがこの問題への最善のアプローチに光を当てることができますか? クラスを再設計する必要がありますか? もしそうなら、それはどのように見えるべきですか?ジェネリック?

ありがとう!

考慮すべきコード:

Class CameraBase {

protected:

 SomeDataMember mDataMember;
}

Class FreeCamera : public CameraBase {

public:

  void SomeFreeCameraSpecificMethod();
}

class StaticCamera: public CameraBase {

public:

  void SomeStaticCameraSpecificMethod();
}

Class CameraFactory {

public:

  static BaseCamera* createCamera(CameraTypeEnum _type) {

    switch (_type) {

      case FREE:
        return createFreeCamera();
        break;

      case STATIC:
        return createStaticCamera();
        break;
    }
  }
}

FreeCamera* freeCam = static_cast<FreeCamera*>(CameraFactory::createCamera(FREE));
4

0 に答える 0