The Double Dispatch Pattern

When the game engine determines that an UFO collides with another UFO, the latter is responsible for doing the proper effects (damage and such).

Example: Ship collides with generic UFO.

Ship::collideWithUFO(UFO u) {
   u.collideWithShip(this);
}

UFO::collideWithShip(Ship s) {
   /* Subclass responsibility.
    * Example:
    *       s.takeDamage(50);
    */
}