| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/05/2009 09:35:44
|
Alexandre Gazola
JavaTeenager
![[Avatar]](/images/avatar/07845cd9aefa6cde3f8926d25138a3a2.jpg)
Membro desde: 23/07/2004 14:48:23
Mensagens: 176
Localização: Rio de Janeiro
Offline
|
Olá pessoal,
gostaria de saber como vcs estruturariam a solução para a seguinte situação:
1 - Eu tenho uma interface TipoA com alguns métodos que são obrigatórios que todos os objetos que são do TipoA implementem;
2 - Eu tenho uma interface TipoB extends TipoA e TipoC extends TipoA, que estedem a interface TipoA com alguns métodos específicos que os objetos que implementam TipoB e TipoC precisam implementar.
3 - Por fim, tenho as classes TipoBDefault implements TipoB e TipoCDefault implements TipoC. Agora, na implementação dessas classes, a maioria dos métodos provenientes de TipoA possuem uma implementação comum, mas não todos. A pergunta é: onde colocar o código comum? Na minha opinião, o melhor (ou menos pior) seria colocar numa classe abstrata das quais TipoB e TipoC herdam, da seguinte forma:
Mas, como bem observado no comentário do Fabio Kung no blog da Caelum ( http://blog.caelum.com.br/2006/08/26/ei-como-e-o-seu-dao-ele-e-tao-abstraido-quanto-o-meu/ ), este é um mau uso da herança, apenas para reutilização de funcionalidade.
Poderíamos quebrar essa classe abstrata, criando uma outra interface TipoComImplementacaoComum contendo apenas os métodos de TipoA cuja implementação é a mesma para ambas as classes TipoBDefault e TipoCDefault e então, injetamos essa dependência nessas classes, da seguinte forma:
Nesta última opção, teríamos a criação de uma interface a mais (mais um .java), com diversos métodos idênticos aos já declarados na interface TipoA (tudo bem, poderíamos fazer TipoA herdar desta outra interface). Sei que o exemplo ficou bem ruim usando esses nomes abstratos, mas, numa situação dessas, a herança a partir de uma classe abstrata não provoca tantos problemas, O que acham?
abraços
|
Alexandre Gazola
Blog: http://alexandregazola.wordpress.com
"Que proveito tem o homem ganhar o mundo inteiro e perder a sua alma?" (Mc. 8:36)
"Buscai, em primeiro lugar, o Reino de Deus e a sua justiça, e todas essas coisas vos serão dadas por acréscimo" (Mt. 6:33) |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/05/2009 10:10:58
|
Guilherme Gomes
Virtual Machine Man
![[Avatar]](/images/avatar/1d32607ab01409c4b6916c5cae13b269.jpg)
Membro desde: 25/06/2007 14:32:09
Mensagens: 686
Localização: São Paulo
Offline
|
Não vejo problema na estrutura inicial, onde você cria uma AbstractTipoA. Afinal, suas implementações de TipoB e TipoC não são obrigadas a fazer um extends AbstractTipoA. Só fazem aquelas que realmente necessitam.
Agora, se você realmente se sente incomodado por usar isso, substitua pelo padrão Template Method e veja se é o caso.
|
-----------
Atenciosamente,
Guilherme V. F. Gomes. |
|
|
 |
|
|
|
|