Тебе действительно нужно разыграть. Это нормально, а иногда и необходимо. Обычно это признак того, что что-то не так.
В идеале, если метод / процедура принимает / возвращает интерфейс, тогда ваша логика заботится только о членах, представленных этим интерфейсом. Если внутри этого метода вы обнаружите, что проверяете точный тип, чтобы можно было привести его к этому типу и вызывать разные члены в зависимости от типа, то, возможно, что-то не так.
Допустим, у вас есть интерфейс IContact , и некоторые из ваших сущностей, которые реализуют это, являются вашими классами Клиент , Покупатель и Подрядчик . Если у вас есть метод SendChristmasCard , который принимает IContact, он должен заботиться только о членах IContact . Если у вас есть логика внутри этого метода, который выполняет выбор Case на obj.GetType().ToString
, чтобы выяснить, является ли он Клиентом или нет, тогда:
- Эта функциональность, вероятно, должна быть отключена в Customer -центрической стороне вашей кодовой базы, принимая объект Customer в качестве параметра. (В вашем примере была бы отдельная логика для воздействия на класс A и класс B.)
- IContact должен определять общие члены, которые будет вызывать ваш метод SendChristmasCard , и полностью игнорировать логику, которая происходит внутри конкретного объекта. Каждый класс, который реализует IContact , будет реализовывать эти члены по-своему. (В вашем примере класс A также реализует свойство B, но ничего с ним не сделает.)
В случае, когда метод возвращает интерфейс, и вы используете объект, вышеупомянутое все еще применимо, но по моему опыту это может , время от времени Лучше мириться с кастингом. Усложнение, которое вы добавляете, «исправляя» ситуацию, может усложнить ситуацию. Я бы сказал, что чем дальше и нестандартнее логика, тем проще. SendChristmasCard явно не является основной функциональностью; и если фабричный метод IContact - это только удобный метод, который дает вам все контакты, то, возможно, просто используйте его, передайте его SendChristmassCard (IContact Contact) , и внутри проверьте тип, чтобы сказать «это было отличная покупка у вас в этом году "или" это была отличная продажа для вас в этом году "и т. д. Но если это основная логика в вашей системе, вам действительно нужно искать лучший путь .
Ознакомьтесь с Pattern Decorator , что может помочь в таких ситуациях.