Когда допустимо использовать instanceof? [закрыто]

Я разрабатываю игру. В игре различные игровые объекты расширяют различные интерфейсы (и один абстрактный класс) в зависимости от того, что им нужно делать, и передаются обработчикам, которые заботятся об элементах с определенным интерфейсом через определенные промежутки времени (они фактически распределяют всю свою работу аккуратным образом, чтобы убедиться, что ввод/видео/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 имело смысл в какой-то конкретной ситуации. Кому-нибудь кажется, что дизайн в корне неправильный? Если да, то что бы вы посоветовали сделать, чтобы добиться такого же поведения.

28
задан Erick Robertson 5 January 2012 в 20:36
поделиться