Tenemos un conjunto de clases que se derivan de un conjunto común de interfaces de tal manera queCodificación de mí mismo en una esquina
IFoo-> BasicFoo, ReverseFoo, ForwardFoo
IBar -> UpBar, DownBar, SidewaysBar
IYelp -> Yip, Yap, Yup
el que el constructor para las miradas del Foo como Foo(IBar, IYelp)
Estos artículos se utilizan en todo el proyecto.
Existe otra clase que tiene un método cuya firma es public double CalcSomething(IFoo, IAnotherClass)
que se aplica en algún momento a todos y cada uno de los Foo. Hemos recibido una solicitud desde arriba de que una composición de objeto particular, digamos un BasicFoo(UpBar,Yip)
, usa un algoritmo diferente al encontrado en CalcSomething
.
Mi primer instinto fue decir que cambiemos la interfaz IFoo para que podamos mover la lógica al nivel de clase Foo, cambiar el constructor a Foo(IBar, IYelp, IStrategy)
y luego hacer que los objetos Foo encapsulen esta lógica. Desafortunadamente, también nos han dicho que el diseño de la arquitectura estipula que no habrá dependencias entre IFoo
, sus implementaciones y IAnotherClass
. Ellos son inflexibles sobre esto.
Ok, claro, entonces pensé que podría usar un patrón de visitante pero ... ¿cómo? El objetivo de hacer la composición fue que ninguna otra clase pudiera ver los detalles de la implementación. ¿Reflexión para mirar dentro de los objetos, rompiendo por completo la encapsulación? Oh diablos, no.
Así que he venido aquí porque estoy perdido. ¿Alguien tiene alguna sugerencia de cómo podríamos tratar un caso especial de una de las composiciones sin modificar la composición o romper la encapsulación? Tiene que haber una solución simple que estoy pasando por alto.
Editar:
Eliminado comienzo infractor. Cambiado "manejado especialmente" en un significado más descriptivo.
Nunca falla: cuando una pregunta comienza tratando de justificar que no se publique el código, el intento resultante de evitar publicar el código hace que todo el lío sea casi imposible de entender. – delfuego
eliminado la parte ofensiva – wheaties
¿Puedes aclarar a qué te refieres con "tratado de manera especial"? –