Tengo un abstract class A
que declara un método abstracto doStuff
. Actualmente hay muchas clases que heredan A
e implementan doStuff
.
Las instancias de la clase se inicializan en tiempo de ejecución mediante AFactory
la entrada del usuario. Originalmente, todas las clases tenían el mismo parámetro único (la entrada del usuario). Pero ahora tengo un parámetro adicional que solo A
necesita una nueva clase que herede .
Desglosándolo, pensé en la siguiente lógica:
La clase de intérprete que genera instancias basadas en la entrada del usuario (usando,
AFactory
por supuesto) no tenía conocimiento de este parámetro adicional.- Intentar introducirlo en la clase de intérprete de clase sería realmente incómodo porque entonces tendría que saber cuándo pasarlo a la fábrica, lo que anula el propósito de tener una fábrica en primer lugar.
- Enviarlo ciegamente a la Fábrica con la esperanza de que pueda hacer algo con él también parece bastante feo.
Mi solución actual: Mientras tanto he decidido refactor
A.doStuff(Param param)
enA.doStuff(AParams params)
.AParams
puede contener todos los parámetros necesarios ydoStuff
puede ignorarlos si no están interesados en ellos. Esto también me parece un poco incómodo y me evita enviar estructuras en WIN32API que pueden contener muchos parámetros feos e inútiles y no me gusta.
¿Hay alguna forma más elegante de abordar este problema? ¿O algún patrón de diseño que he pasado por alto y resuelve esto?
Notas :
- Estamos usando Java 1.7
- Los nombres de las clases son tontos para enfatizar el tema del diseño teórico, tienen nombres normales indicativos y significativos en la realidad :)
- Realicé muchas búsquedas, pero después de haber descubierto que es bastante difícil buscar en la web problemas teóricos abstractos específicos (en lugar de por qué está
X
arrojandoException
este código), he decidido preguntar de todos modos, así que lo siento si esto es un duplicar.
Editar 1 :
- Aclaración: necesito pasar un argumento específico de subclase al
doStuff
método.
EDITAR 2 :
No entendí completamente la intención de Kilian Foth, así que escribí un pseudocódigo de Java para ayudarme a explicar mejor el problema / comprender su solución. Entonces:
Este es un esqueleto de mi problema.
Este es un esqueleto de mi solución.
Esto es lo que creo que podría ser la solución de Kilian Foth, pero no estoy seguro.
EntryPoint
para llamarlo, main
que luego invoca a algunos Interpreter
que actualmente no reciben el parámetro adicional como parámetro y también lo hace la fábrica. El parámetro adicional proviene de otro tipo de entrada del usuario que no se describe UserInput
(que desafortunadamente no puedo cambiar).
doStuff
método?