Я разрабатываю игру. В игре различные игровые объекты расширяют различные интерфейсы (и один абстрактный класс) в зависимости от того, что им нужно делать, и передаются обработчикам, которые занимаются элементами с определенным интерфейсом через определенные промежутки времени (они фактически распространяют всю свою работу в аккуратном виде, чтобы убедиться, что вход/видео/etc всегда обрабатывается).
В любом случае некоторые из этих объектов расширяют абстрактный класс Collider и передаются в CollisionHandler. Класс и обработчик Collider заботятся обо всем, что связано с техническими проблемами при столкновении, и просто спросите, что объект реализует функцию collidesWith (Collider c) и модифицирует себя на основе того, с чем столкнулся.
Объекты многих разных классов будут сталкиваться друг с другом и будут действовать по-разному в зависимости от того, с каким типом объекта они сталкивались, и с его конкретными атрибутами.
Идеальное решение похоже на использование instanceof так:
class SomeNPC extends Collider{
collidesWith(Collider c){
if(c instanceof enemy){
Fight it or run away depending on your attributes and theirs.
}
else if(c instanceof food){
Eat it, but only if it yellow.
}
else if(c instanceof BeamOfLight){
Try to move towards its source.
}
}
}
Это действительно похоже на законное место для instanceof. Я просто получаю это плохое чувство. Например, как если бы goto имел смысл в какой-то конкретной ситуации. Сформирован ли дизайн в любом случае? Если да, то что бы вы порекомендовали сделать для достижения такого же поведения.