私は人々の避難シミュレーターを開発しています。開始時に、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 プロパティが変更される可能性があるため、タイプに応じて変更する必要があります。この機能を共通化して基本クラスに配置することはできません。窓は閉じていない、耐火ドアは火を恐れていませんが、他の機能はそうしています。これらのプロパティを動的に保存/追加/削除する方法 (デザイン パターンなど) はありますか? または、建物アイテムの完全な階層は非常に複雑で扱いにくいため、サブクラス化をまったく避けてください。