История изменений
Исправление dvetutnev, (текущая версия) :
необходимо преобразование типов как вверх, так и вниз
Это дурно пахнет. Иногда конечно необходимо, но лучше не надо.
Сама идея разветвлять логику в зависимости от того, какой конкретно тип достался антипаттерн. Различное поведение для разных типов должно реализоваться в самих Foo и Bar (динамический полиморфизм), а логика их использующая должна одинаково работать и с Foo, и с Bar.
Рекомендую также посмотреть на шаблон visitor.
без кастования типов пришлось бы переносить некоторый функционал в сам интерфейс, а это еще больший говнокод
Зачем в интерфейс? Можно в базовый класс отнаследованный от интерфейса. И не такой уж страшный говнокод наличие части реализации в интерфейсе. Уж точно не хуже кастования типов и ветвления от этого логики.
Исходная версия dvetutnev, :
необходимо преобразование типов как вверх, так и вниз
Это дурно пахнет. Иногда конечно необходимо, но лучше не надо.
Сама идея разветвлять логику в зависимости от того, какой конкретно тип достался антипаттерн. Различное поведение для разных типов должно реализоваться в самих Foo и Bar (динамический полиморфизм), а логика их использующая должна одинаково работать и с Foo, и с Bar.
Рекомендую также посмотреть на шаблон visitor.