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