0

私は人々の避難シミュレーターを開発しています。開始時に、XML ファイルからツリー状の建物構造データ (床/部屋/壁など) を読み込み、人の初期構成を読み込み、ユーザー定義の移動モデル パラメータを読み込み、シミュレーションを開始します。たとえば、モデルの各ステップで男性ごとに、彼の近くにあるすべてのジオメトリ オブジェクトを見つけ、建物から出るパスに最も近いパスを選択する必要があります。

そのため、人々が移動する建物を表す明確な OOP ウェイをロードする必要があります。私はこれに固執しました(単なる例):

class Aperture
{
   ...
public:
    virtual QRectF extent() = 0;
    virtual QString description() const = 0;
    // other common for all apertures methods

private:
   int m_srcRoomID;
   int m_dstRoomID;
   // other generic aperture properties
};

class Window: Aperture
{
    ...
public:
    virtual void extent() override;
    virtual QString description() override;
    // other overrides

private:
    EGlassType m_glassType;
    bool m_bOpenable;
    // other window-specific properties
};

// and other descendants: Door, CompositeDoor and so on

問題: すべての建物のアパーチャを抽象 base へのポインターとして 1 つのコレクションに格納しAperture、派生アパーチャーへのキャストを行わずに基本仮想関数のみを使用したい。
BUT : 避難中にさまざまな Aperture プロパティが変更される可能性があるため、タイプに応じて変更する必要があります。この機能を共通化して基本クラスに配置することはできません。窓は閉じていない、耐火ドアは火を恐れていませんが、他の機能はそうしています。これらのプロパティを動的に保存/追加/削除する方法 (デザイン パターンなど) はありますか? または、建物アイテムの完全な階層は非常に複雑で扱いにくいため、サブクラス化をまったく避けてください。

4

2 に答える 2

0

仮想関数を追加して、基本クラスApertureのプロパティを設定できます。

virtual void update(vector)= 0; またはvirtualvoidupdate(...)= 0;

于 2013-01-23T10:40:16.557 に答える
0

ドアを閉じることを決定するエンティティは、ドアを閉じることができることを知る必要があり、その状態を変更することも検討する必要があります。以下にいくつかのオプションを示します。

  • ジェネリックな仮想メソッド ( Aperture::updateAperture::interactWithFireAperture::iteractWithPersonまたは同様のもの) でオブジェクト自体を決定します。
  • Visitor パターンを使用します。つまり、virtual Aperture::visit適切にオーバーロードされたメソッドを訪問者に呼び出します。これにより、意味のあるオブジェクトの組み合わせに対してのみ対話メソッドを定義できます。
  • 「インターフェース」を使用します。たとえば、適切な場所でIClosable閉じることができるものなら何でも使用してください。実際には、必要なオーバーロードの数を減らすために、ビジター パターンでもそのようなインターフェースを使用することになるでしょう。DoorIClosable * closable = dynamic_cast<IClosable *>(apperture); if(closable) { /* consider whether it should be closed */ }

いずれか、またはこれらの組み合わせが機能する場合、オブジェクト指向アプローチは実行可能です。

于 2013-01-23T10:40:28.077 に答える