すべてのシミュレートされたオブジェクトが実装するいくつかのインターフェイスを持つシミュレーターを作成しています。インターフェイスには、EntityID の取得やオブジェクトの状態のタイム ステップの進行など、すべてのオブジェクトに必要なメソッドがあります。CollidableextendsEntityであり、衝突検出アルゴリズムの実行時に考慮する必要があるボリュームと位置を持つものを表します。FieldextendsEntityであり、場所を値にマップするものすべてを表します。これらは、世界に浸透しているが、体積や物理的形状を持たない磁場などをモデル化するために使用されます。剛体ダイナミクス アルゴリズムRigidBodyを実装および提供するクラスです。Collidableすべてを管理するWorldクラスがありますEntitiesまた、衝突検出をより効率的にするために、シミュレーターのクロックを進め、世界を分割する方法があります。
Entity私の問題には、からサブタイプを取得することが含まれWorldます。元々、ID によってキー付けされWorldた のマップがあり、マップから取得して、チェックと目的のサブタイプへのキャストを行うメソッドが存在します。ただし、使用法が嫌われていることは十分承知しているので、別のアプローチを試みました。EntitiesFieldRigidBodyEntityinstanceofinstanceof
World現在、インターフェイスごとに個別のマップがあります。たとえばCollidables、 のマップとすべてのマップがありますEntities。このaddCollidable()メソッドは両方のマップに追加し、マップgetCollidable()からのみ取得しCollidableます。これは を回避しますinstanceofが、それでも私には設計が不十分なようです。を拡張するための別のインターフェイスを思いついた場合はEntity、別の map inWorldと対応するメソッドが必要になります。
この問題はそれほど曖昧ではないように感じますが、この状況では通常何が行われますか?
編集
Visitor パターンがここで機能するとは思えません。Visitor を使用すると具体的な型をディスパッチでき、私の取得メソッドのいくつかはインターフェイスの型を取得する必要があるからです。たとえば、Visitor は、取得するメソッドやその他の具象クラスがWorld必要な場合のみ機能しますが、 Visitor ですべてを取得するメソッドを作成することはできません。RigidBodiesCollidables