Tengo un abstract class Aque declara un método abstracto doStuff. Actualmente hay muchas clases que heredan Ae implementan doStuff.
Las instancias de la clase se inicializan en tiempo de ejecución mediante AFactoryla 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 Anecesita 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,
AFactorypor 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).AParamspuede contener todos los parámetros necesarios ydoStuffpuede 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á
XarrojandoExceptioneste 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
doStuffmé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.
EntryPointpara llamarlo, mainque luego invoca a algunos Interpreterque 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).
doStuffmétodo?