Eu tenho um abstract class A
que declara um método abstrato doStuff
. Atualmente, existem muitas classes que herdam A
e implementam doStuff
.
As instâncias da classe são inicializadas em tempo de execução via com AFactory
base na entrada do usuário. Originalmente, todas as classes tinham o mesmo parâmetro único (a entrada do usuário). Mas agora eu tenho um parâmetro adicional que apenas uma nova classe que herda A
necessidades.
Então, detalhando, pensei na seguinte lógica:
A classe de intérpretes que gera instâncias com base na entrada do usuário (usando, é
AFactory
claro) não estava ciente desse parâmetro extra.- Tentar inseri-lo no intérprete de classe seria muito estranho, porque eu teria que saber quando passá-lo à fábrica, o que anula todo o propósito de ter uma fábrica em primeiro lugar.
- Enviá-lo às cegas para a fábrica, esperando que possa fazer algo com isso, também parece bastante feio.
Minha solução atual: Enquanto isso eu decidi refactor
A.doStuff(Param param)
emA.doStuff(AParams params)
.AParams
pode conter os parâmetros necessários edoStuff
pode ignorá-los se não estiverem interessados neles. Isso também me parece um pouco estranho e me impede de enviar estruturas no WIN32API que podem conter muitos parâmetros inúteis e feios e não gosto disso.
Existe uma maneira mais elegante de abordar esse problema? Ou algum padrão de design que eu negligenciei e resolve isso?
Notas :
- Estamos usando o Java 1.7
- Os nomes das turmas são bobos, a fim de enfatizar a questão do design teórico, eles têm nomes indicativos e significativos normais na realidade :)
- Pesquisei bastante, mas depois de descobrir que é muito difícil pesquisar na Web questões teóricas abstratas específicas (em vez de por que está
X
lançandoException
esse código), decidi perguntar mesmo assim, desculpe se isso é um duplicado.
Editar 1 :
- Esclarecimento: preciso passar um argumento específico da subclasse para o
doStuff
método.
EDIT 2 :
Como não entendi completamente a intenção de Kilian Foth, escrevi um pseudo-código Java para me ajudar a explicar melhor o problema / entender sua solução. Assim:
Este é um esqueleto do meu problema.
Este é um esqueleto da minha solução.
Isso é o que eu acho que poderia ser a solução da Kilian Foth, mas eu não tenho certeza.
EntryPoint
vamos chamá-lo, main
que então chama alguns Interpreter
que atualmente não recebem o parâmetro extra como parâmetro e a fábrica também. O parâmetro extra vem de outro tipo de entrada do usuário que não é descrito por UserInput
(que infelizmente não posso alterar).
doStuff
método?