Это для небольшого игрового проекта с SDL на MinGW/Windows.Наследование/интерфейс решения для физического движка
Я работаю на физический движок, и моя идея состояла в том, чтобы иметь Physics::Object
, что все физические объекты должны выводим из и регистрирует себя с глобальным Physics::System
класса (это модель monostate), так что пользователь не необходимо отслеживать, какие объекты включены в физические вычисления, и просто нужно вызвать функцию типа Physics::System::PerformTimestepCalculation(double dt)
.
Это прекрасно работает, и я даже реализовал его с использованием одного производного класса Physics::Circle
, который представляет собой 2-й круг. Я был очень доволен прогностическим обнаружением столкновения, хотя мне все еще нужно его оптимизировать.
В любом случае, я столкнулся с проблемой, когда я начал добавлять другие примитивы для включения в расчет, например. линия. Physics::System::PerformTimestepCalculation(double dt)
был завален звонками Object::GetID()
или аналогичными функциями (может ли избежать dynamic_cast <>), но я чувствую себя грязным.
Я сделал немного reading и понял, что мои элементы моей иерархии не подменяются (т. Е. Столкновение между двумя кругами очень сильно отличается от столкновения двух строк).
Мне нравится, как мой Physics::Objects
«самостоятельно регистрируется» с классом System
, поэтому они автоматически включаются в вычисления, и я действительно не хочу этого потерять.
Должны быть какие-то другие разумные пути проектирования. Как я могу лучше переделать вещи, чтобы не подменяемые объекты не мешали?
Edit FYI: В конце концов я оторвались сущность и формы свойства, подобно тому, как это было описано в принятом ответе, и аналогичные модели сущность-компонентной системы. Это означает, что у меня все еще есть логика yuk «это круг или линия, и это линия или круг?», Но я больше не притворяюсь, что полиморфизм помогает мне здесь. Это также означает, что я использую какой-то завод и могу иметь сразу несколько вычислительных миров!
Вы имеете в виду у вас есть проблемы [двойной доставки] (http://en.wikipedia.org/wiki/Double_dispatch)? Если я правильно помню, [Modern C++ Design] (http: //www.amazon.ca/Modern-Design-Generic-Programming-Patterns/dp/0201704315) содержит главу о методах реализации, и это может вас заинтересовать. –