Я разрабатываю игру. В игре различные игровые объекты расширяют различные интерфейсы (и один абстрактный класс) в зависимости от того, что им нужно делать, и передаются обработчикам, которые заботятся об элементах с определенным интерфейсом через определенные промежутки времени (они фактически распределяют всю свою работу аккуратным образом, чтобы убедиться, что ввод/видео/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's yellow.
}
else if(c instanceof BeamOfLight){
Try to move towards its source.
}
}
}
На самом деле это кажется законным местом для instanceof. У меня просто плохое предчувствие. Как если бы goto имело смысл в какой-то конкретной ситуации. Кому-нибудь кажется, что дизайн в корне неправильный? Если да, то что бы вы посоветовали сделать, чтобы добиться такого же поведения.