Sto scrivendo un simulatore che ha diverse interfacce che tutti gli oggetti simulati implementano. L'interfaccia Entity
ha metodi che devono avere tutti gli oggetti, come il recupero dell'ID e l'avanzamento del passo temporale per lo stato dell'oggetto. Collidable
estende Entity
e rappresenta qualsiasi cosa con volume e posizione da tenere in considerazione quando vengono eseguiti algoritmi di rilevamento delle collisioni. Field
estende Entity
e rappresenta tutto ciò che associa una posizione a un valore; questi sono usati per modellare cose come i campi magnetici che permeano il mondo ma non hanno volume o forma fisica. RigidBody
è una classe che implementa Collidable
e fornisce algoritmi di dinamica del corpo rigido. Ho una classe World
che gestisce tutto il Entities
e ha metodi per far progredire l'orologio del simulatore e partizionare il mondo in modo da rendere più efficiente il rilevamento delle collisioni.Qual è un buon modello per la memorizzazione delle implementazioni di un'interfaccia e il recupero di implementazioni specifiche?
Il mio problema riguarda il recupero dei sottotipi Entity
da World
. Originariamente,aveva solo una mappa di Entities
digitata per ID, e per recuperare un Field
o RigidBody
ci sarebbero metodi che afferrerebbero Entity
dalla mappa e fare un controllo instanceof
più un cast per il sottotipo desiderato. Sono ben consapevole del fatto che l'uso di instanceof
sia disapprovato, tuttavia, ho provato un altro approccio.
Attualmente, ho mappe separate all'interno di World
per ogni interfaccia. Ad esempio, c'è una mappa per Collidables
e una mappa per tutti Entities
. Il metodo addCollidable()
verrà aggiunto a entrambe le mappe e lo standard getCollidable()
verrà recuperato solo dalla mappa Collidable
. Questo evita instanceof
, ma mi sembra ancora un cattivo design. Se sago un'altra interfaccia per estendere Entity
, ho bisogno di un'altra mappa in World
e metodi corrispondenti.
Mi sembra che questo problema non sia terribilmente oscuro, quindi cosa viene fatto in genere in questa situazione?
EDIT
Io non credo che il modello Visitor funzionerà qui, come Visitatore consente di messaggio concernente il tipo concreto, e alcuni dei miei metodi di recupero ha bisogno di recuperare tipi di interfaccia. Ad esempio, Visitor funzionerebbe se i metodi World
richiedessero solo i metodi per recuperare RigidBodies
e altre classi concrete, ma non è possibile creare un metodo che recuperi tutti i dati Collidables
con Visitor.
Si può avere qualcosa come " T getEntityFromMap (Clase clazz)", questo metodo rimuove la necessità della mappa 'Collidables', e basta chiedere' getEntityFromMap (Entity.class) 'per ottenere un Entità nel suo caso più generale, e .... –