У нас есть набор классов, которые вытекают из общего набора интерфейсов, так что
IFoo-> BasicFoo, ReverseFoo, ForwardFoo
IBar -> UpBar, DownBar, SidewaysBar
IYelp -> Yip, Yap, Yup
где конструктор для Foo выглядит как Foo(IBar, IYelp)
Эти элементы используются во всем проекте.
Существует еще один класс, у которого есть метод, подпись которого public double CalcSomething(IFoo, IAnotherClass)
, который применяется в некоторой точке к каждому Foo. У нас был запрос сверху вниз, что одна конкретная композиция объекта, скажем, BasicFoo(UpBar,Yip)
, использует другой алгоритм, отличный от найденного в CalcSomething
.
Мой первый инстинкт должен был сказать, пусть изменить интерфейс IFoo таким образом мы можем переместить логику вплоть до уровня класса Foo, измените конструктор быть Foo(IBar, IYelp, IStrategy)
и затем объекты Foo инкапсулировать эту логику. К сожалению, нам также сказали, что дизайн архитектуры предусматривает отсутствие зависимостей между IFoo
, его реализациями и IAnotherClass
. Они непреклонны в этом.
Хорошо, конечно, тогда я подумал, что могу использовать шаблон посетителя, но... как? Весь смысл создания композиции состоял в том, чтобы ни один другой класс не смог увидеть детали реализации. Отражение, чтобы заглянуть внутрь объектов, полностью нарушая инкапсуляцию? Ах, черт возьми.
Итак, я пришел сюда, потому что я в недоумении. Есть ли у кого-нибудь какие-либо предложения, как мы могли бы рассматривать частный случай одной из композиций без изменения состава или разрушения инкапсуляции? Должно быть простое решение, которое я пересматриваю.
Edit:
Удалено оскорбительное начало. Изменено "обрабатывается специально" в более описательное значение.