Это основная проблема с несколькими отправками. К сожалению, большинство языков не поддерживают множественную диспетчеризацию.
Так что я бы, вероятно, использовал карту карт. Внешняя карта отображает атаки на карты защиты, которые, в свою очередь, отображают защиту на очки / эффекты / что угодно.
Вы можете использовать шаблон Visitor, но это становится громоздким быстро.
В Python, предполагая, что вы не используете много подклассов (например, нет подклассов Ice), вы можете использовать словарь, отображающий (attack,defense)
кортежей для оценки. Это было бы довольно чистым решением и было бы поддержано множеством языков (все, что вам нужно, это класс Pair и возможность представлять типы атак как объекты, либо через объект класса, либо что-то вроде перечисления).