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 ;-)

Foi útil?

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 interfaces.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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top