Cheat única herança em Java?
-
09-06-2019 - |
Pergunta
Eu ouvi há uma maneira de enganar única herança e implementar herança múltipla em Java.Alguém sabe como implementar isso(com a utilização de interface)?
Só por curiosidade ;-)
Solução
Claro que você pode, mas é complicado e você realmente deve considerar-se que o caminho que você quer seguir.
A ideia é usar o escopo baseado em herança, juntamente com o tipo baseada em um.Que é tipo falar para dizer que, para fins internos, classes internas "herdar" métodos e campos do exterior da classe.É um pouco como mixins, onde o exterior é o de classe mista-no para o interior de classe, mas não tão seguro, como você pode alterar o estado da classe externa, bem como seus métodos.
Gilad Ettinger (uma das principais da linguagem java designers) escreveu um papel discutir o assunto.Assim, suponha que você deseja compartilhar alguns métodos para uso interno entre algumas classes não relacionadas (e.g, para manipulação de seqüência de caracteres), você pode criar sub-classes-los como classes internas de uma classe que possui todos os necessários métodos, e as sub-classes podem usar métodos tanto de suas super classes e a partir do exterior da classe.
De qualquer maneira, é complicado para classes complexas, e você pode obter a maior parte da funcionalidade usando estático importações (a partir do java 5 em).A grande questão para entrevistas de emprego e pub questionários, embora ;-)
Outras dicas
ÚnicoHerança múltipla não é suportado pelo Java, em vez disso, ele possui interfaces para servir o mesmo propósito.No caso de você são inflexíveis sobre como utilizar herança múltipla, deve ser feito em C++.
Uso de composição em vez de herança tende a ser a maneira de contornar isso.Isso também ajuda muito com capacidade de teste, então é uma boa prática em geral.
Se você quer apenas o seu tipo para "se comportar" como vários outros tipos, você pode herdar de interfaces quantos que gosta;você não pode "pegar emprestado" detalhes de implementação de estes, embora, obviamente.
Eu acredito que a razão fundamental que o Java não suporta herança múltipla é o mesmo que C#;todos os objetos são, em última análise derivado do Objeto e ter vários caminhos para a mesma classe base é ambíguo para o compilador.Ambíguo == Ruim, então o compilador não permite isso.
Em vez disso, você pode simular a herança múltipla através de delegação.Ver este artigo para um exemplo.
Você pode enganar um pouco (e eu um pouco o stress) utilizando java.lang.refletir.Proxy instâncias.
Isso realmente apenas permite que você adicionar extra interfaces e delegar as suas chamadas para outra instância em tempo de execução.
Como alguém que mentores e tutores novos desenvolvedores eu ficaria horrorizado se alguém me mostrou código que fizeram isso.A reflexão é uma das ferramentas que você realmente precisa para entender e ter uma boa compreensão do Java antes de saltar.Eu, pessoalmente, só nunca fiz isso uma vez, e foi fazer algumas código de eu não ter controle sobre a implementar algumas interfaces de algum outro código que eu não tinha controle sobre esperava (foi uma gambiarra, então eu não tinha para escrever e manter muita cola código).
Utilização interface
s.Você pode implementar como muitos como você gostaria.Geralmente, você pode usar alguma variante no Composto Padrão (GoF) para ser capaz de reutilizar o código de implementação se que é desejável.
Você precisa ter o cuidado de distinguir a herança da interface (que é essencialmente a herança de um contrato de prestação de determinado instalações), desde a implementação de herança (herança de mecanismos de implementação).
Java fornece a interface herança o implementa mecanismo e você pode tem vários herança da interface.
A herança de implementação é o estende-se mecanismo e você só tem uma única versão de que.Você realmente precisa de vários herança de implementação?Eu aposto que você não, é repleto de conseqüências desagradáveis, a menos que você seja um Eiffel programador de qualquer maneira.
Você provavelmente poderia "simular" é por gestão o conjunto de superclasses explicitamente e usando a reflexão para pesquisar todas as superclasses para o método de destino.Eu não gostaria de fazer isso em produção, mas talvez um brinquedo interessante programa.Você provavelmente poderia fazer um monte de coisas estranhas, aproveitando a reflexão, a criação de classes na mosca, e invocar o compilador através de programação.
JAVA não suporta Herança de vários.
Você pode começar a implementar várias interfaces e alguns vêem isso como uma forma de contornar o problema.Pessoalmente, eu ainda tenho que usar vários herança, então eu realmente não posso compreender o seu apelo.
Normalmente quando alguém sugere várias herança em c# ou JAVA devido ao fato de que "eles poderiam" em c++.Eu sou um fã de 'só porque você pode doens não significa que você deve'.Como o c# & JAVA não suporta isso, por que tentar e forçar a fazer algo que ele não foi projetado para fazer.Isto não é para dizer que há casos particulares, é uma técnica válida para empoly, apenas o código geralmente pode ser refatorado para não precisar dele.
Eu estava pensando sobre isso um pouco mais e percebi que a dinâmica proxies vai trabalhar (é como RMI (usado?) para o trabalho), se você realmente quer esse tipo de funcionalidade, você seria melhor fora olhando programação orientada a aspectos (AOP), usando algo como o AspectJ (eclipse.org/aspectj).
Desta forma, você pode obter vários aspectos diferentes em uma classe, dando-lhe pseudo mixin herança, sem terrivelmente frágil herança heirarchies.
Como todo mundo tem apontado para, querendo/precisando de herança múltipla, geralmente, indica que você não abordar o problema a partir da perspectiva correta.Lembre-se de que o GoF princípio da "prefira composição a herança" para começar!
Houve um esforço para trazer mixins em Java.Verifique este link: http://www.disi.unige.it/person/LagorioG/jam/
Usando Classes Internas, isto é o que C++, às vezes, prefere assim: Classe Interna Idioma.
Sim, você pode dizer que é um truque e é muito Interessante que você pode herdar várias classes de uma classe única, mas é possível implementar várias Interfaces para uma classe como
public class parents implements first, second{
}
mas lembre-se, você tem que substituir os métodos declarados na interface.