EDIT: I Apologize, after rereading your question I see that this isn't really relevant. I don't know how to delete a post so I'm just leaving this edit. If a mod wants to delete it that's cool. But maybe it'll be helpful to you or someone anyway
I'm not good at this stuff yet, but I'm dealing with something similar in my game so I figured I'd at least give you my two cents, for whatever it's worth, since you don't have any other answers yet.
I have a similar system for collision detection and my gameObject class has a collide(GameObject otherObject) method method in it. when a collision happens, this method is called on both colliding objects, passing the other object as the parameter for both of them of course, and then each individual object handles the reaction.
The GameObject class that all my objects derive from has a flag for 'dynamic', meaning an object that moves on it's own and reacts to gravity/collisions etc. players and enemies and things that follow the laws of physics are dynamic, while stationary objects and objects like moving platforms that move but only according to a predefined path are dynamic=false. So in the GameObject class I have a default colldie() implementation where if it is dynamic then it just moves the object until it's not colliding anymore and if it's not dynamic it does nothing. If I want different behavior I can always override the collide method for that class.
This way the collision reaction is coupled only to the class of the object that is colliding and colliding objects can handle their own collisions without having to know about anything else other than the object passed into the collide(GameObject) parameter. The one downside is if 2 dynamic objects collide, this would cause the first object who's collide method is called to move until the objects aren't touching and the other object doesn't do anything because by the time it collide()s the objects aren't touching anymore, and this may not be desirable behavior.
I'm considering a couple different ways of handling this:
Either have
if (otherObject.isDynamic && otherObject.isFirstObject) {
//determine how far I need to move to not be colliding with the other object, move half that distance
//Also set isFirstObject to true so that when the second objects collide() method is executed it skips this if block and reacts normally, moving the other half of the way until the objects are no longer touching
} else {
//react normally, just move until not touching anymore
}
Or
if (otherObject.isDynamic)
if (id < otherObject.id) //Only execute the following code if this objects id is lower than the other colliding objects, so it only gets
executed once
//Insert advanced code to handle the reactions of both objects in one place here, moving them as they should be based on their
mass and speed and other factors. Maybe reset their velocities based on bounciness to make them bounce or soemthing
I hope my explanations are relevant and that they make sense
Sorry if I got your hopes up when you saw you had a response and you were expecting someone who actually knew what they were talking about haha