Esto es para un proyecto de juego pequeño con SDL en MinGW/Windows.Decisiones de herencia/interfaz para el motor de física
estoy trabajando en un motor de física, y mi idea era tener un Physics::Object
, que todos los objetos físicos deben derivar de y se registra a sí mismo con una clase mundial Physics::System
(que es un patrón monostate) para que el usuario no lo hace necesita rastrear qué objetos están incluidos en los cálculos de física y solo necesita llamar a una función como Physics::System::PerformTimestepCalculation(double dt)
.
Esto funciona bien, e incluso lo implementé usando una única clase derivada Physics::Circle
, que es un círculo 2d. Estaba bastante contento con la detección de colisión predictiva, aunque todavía tengo que optimizarla.
De todos modos, me encontré con problema cuando comencé a agregar otras primitivas para incluir en el cálculo, p. línea. El Physics::System::PerformTimestepCalculation(double dt)
se llenó de llamadas a Object::GetID()
o funciones similares (puede evitar el dynamic_cast <>), pero me siento sucio.
Hice un poco de reading y me di cuenta de que mis elementos de mi jerarquía no son sustituibles (es decir, la colisión entre dos círculos es muy diferente entre la colisión de dos líneas).
Me gusta la forma en que mi Physics::Objects
"autoregistro" con la clase System
para que automáticamente se incluyan en los cálculos, y realmente no quiero perder esto.
Debe haber algunas otras rutas de diseño sensatas. ¿Cómo puedo rediseñar mejor las cosas para que los objetos no sustituibles no se interpongan en el camino?
Editar FYI: Al final me han separado de la entidad y la forma propiedades, similar a cómo se describe en la respuesta aceptada, y similares a un modelo de componente de sistema de entidad. Significa que todavía tengo la lógica de yuk de "¿es esto un círculo o una línea, y es una línea o un círculo?", Pero ya no estoy pretendiendo que el polimorfismo me ayuda aquí. ¡También significa que utilizo algún tipo de fábrica y puedo tener múltiples mundos de cálculo sucediendo a la vez!
Qué quiere decir que tienen un problema [doble de despacho] (http://en.wikipedia.org/wiki/Double_dispatch)? Si mal no recuerdo, [Modern C++ Design] (http: //www.amazon.ca/Modern-Design-Generic-Programming-Patterns/dp/0201704315) tiene un capítulo sobre técnicas de implementación, y que podría interesarle. –