last day (15 days later) » 

1:23 PM
0
A: Java não possui herança múltipla?

David SchrammelEssa pode ser uma solução para herança múltipla em java Classe Abstrata level 1 public abstract class Animal { public void cicloVida () { System.out.println("Nasce, cresce e morre"); } } Classe Abstrata level 2 public abstract class Mamifero extends Animal { public void a...

 
Não entendi o que isto tem a ver com herança múltipla.
 
Quando se fala em herança múltipla queremos que uma classe herde aspectos de mais de uma classe, o que no caso do java não existe, porem podemos escalar essas heranças de forma acoplada sem perder a coesão.
 
ste é um exemplo que você não está pegando duas coisas distintas, juntando para formar uma terceira. Você está apenas fazendo dois níveis de herança, algo que ocorreria exatamente assim se tivesse como fazer herança múltipla. Para falarmos em herança múltipla o objeto precisa ser duas ou mais coisas diferentes. Ele ser uma coisa que já é outra coisa, não há diferença entre essas duas coisas. Um Mamífero é um Animal, então Final é um Mamífero, ponto. Ele é um Animal por tabela, não adicionalmente. Mas se você acha que isto está simulando herança múltipla, ok. Eu avisei.
 
No final das contas, o teu exemplo public class NovaClasse extends Classe implements Teste tem o mesmo sentido do meu exemplo, porem você terá que ser obrigado a implementar os métodos da classe Teste ou seja, um acoplamento muito alto e uma coesão muito baixa.
 
Não tem o mesmo sentido, lá tem duas funcionalidades completamente diferentes. Claro o meu exemplo é mais abstrato. No meu caso Teste e Classe são coisas completamente independentes, acoplamento inexistente entre elas. No seu caso Mamifero é dependente de Animal, então são coisas relacionadas e altamente acopladas. A herança múltipla junta coisas independentes. Você está juntando coisas que já são dependentes. Mesmo em C++ que tem esse recurso, você teria que fazer desta forma. Mas se você acha que está certo, não discutirei, você não faz software pra mim e não vai me atrapalhar nada.
 
1:23 PM
Tem o mesmo resultado final ou seja, as 2 implementações tem contratos. o problema e que da sua maneira não é possível os objetos compartilharem o os mesmos comportamentos, a não ser que tenham seu codigo repetido nas implementações, mas podem ter varias interfaces na classe ou seja, herança múltipla não existe em java, mas você pode criar seu pattern para atender a sua necessidade da maneira coerente, e não existe uma maneira correta por que não tem sentido em existir.
 
Você está enxergando coisas. Onde tem repetição de código ali? Eu arrumei poque tinha alguns erros de sintaxe. Mas o código é funcional: goo.gl/tdjfRx. No seu exemplo haverá duplicação se for feito herança múltipla. Você conseguiria pegar o meu exemplo e fazer do seu jeito? Eu pensei em eu mesmo fazer, mas não tem como, porque o meu reproduz uma necessidade semelhante ao da múltipla herança e o seu não faz isto.
 
Onde tem repetição de código ali? Não tem repetição, mas se você for utilizar a mesma estrutura para outros objetos em seu projeto, você terá que implementar NOVAMENTE os métodos, resumindo, sua implementação tem apenas uma herança, e um contrato, ela não estende funcionalidades de outra classe, ela apenas tem um contrato, ou seja, não podemos falar que sua implementação é mais coerente para responder a pergunta do que a minha implementação
 
Não, isto acontece na sua implementação. Embora não faça sentido repetir na sua porque você não está simulando herança múltipla. Na minha não tem que repetir, não importa quantas vezes precise usar o Teste em outras classes. A minha tem uma classe e uma implementação. Você não está lendo o código. Você botou na cabeça algo e está repetindo sem olhar. Melhorei o código para você ver que não tem repetição: goo.gl/mCbblv. Fiz seu código usando em outro lugares e fez o que não devia. Aí para fazer o certo tive que repetir código. goo.gl/jBn8i3. Se está errado, mostre o certo.
 
> //esta classe precisa do metodo amamentar. Mas nao do cicloVida, O requisito eh que classe nao tem um cicloVida
R: claro que precisa, eu quero extender o comportamento de 2 classes, no caso, Animal e Mamifero.


> //Oops, tive que reimplementar aqui, repeticao de codigo.
Não precisa não, o metodo está ali sim!!!


> //oops, chamou um metodo que nao deveria existir nesta classe
Claro que deveria existir, herança multipla a classe herdou os comportamentos de 2 outras classes, agora se voce usar a INTERFACE terá que repetir sim
Edit:

> //esta classe precisa do metodo amamentar. Mas nao do cicloVida, O requisito eh que classe nao tem um cicloVida
R: claro que precisa, eu quero extender o comportamento de 2 classes, no caso, Animal e Mamifero.


> //Oops, tive que reimplementar aqui, repeticao de codigo.
Não precisa não, o metodo está ali sim!!!. Agora se você usar a INTERFACE terá que repetir sim


> //oops, chamou um metodo que nao deveria existir nesta classe
Claro que deveria existir, herança multipla a classe herdou os comportamentos de 2 outras classes.
Como você cria um método com corpo em uma interface ? interfaces aceitam apenas assinaturas, em que linguagem está programando ?
 
1:41 PM
Bom, agora você resolveu ler. Já melhorou. Entre de novo e veja não só compilando, como executando: goo.gl/mCbblv
No seu exemplo você está estendendo apena a classe Mamifero que por acaso está estendendo a Animal, você não está estendendo a Animal. na classe Final. Por isto é que este exemplo não simula herança múltipla. Isto é apenas a herança de uma classe que já teve outra herança. Isto é algo vertical. A herança múltipla é horizontal.
Se não precisa reimplementar, tire esse método do código da Classe2 e veja se compila. E você mesmo logo aabixo diz que precisa, você está se contradizendo.
 
Realmente se for possivel implementar um metodo na interface, me passe a versão do java que usa, pois não consegui aqui utilizo a versão 7
 
A especificação de Classe diz que precisa de Amamentar, exatamente como está implementado em Mamifero, mas não precisa do cicloVida(). Então não pode usar o Mamifero, porque ela tem outro método que ela não precisa.
Java 8
 
ok, vou analisar o java 8, pois voce acabou de destruir o conceito de interface que eu tenho
 
Mas a questão não é esta, a questão é que a sua obriga todas as classes que precisam de amamentar() levar junto o cicloVida() junto e existem outras classes que não precisam deste método. Então isto não está simulando herança múltipla. Na herança múltipla você pega comportamentos específicos e junta tudo em uma classe. Se isto empurrar comportamentos indesejados, você não pode usar aquilo na herança. Aí ou reimplementa.
Em Java 7 dá para fazer a algo que é meio termo, dá para ter a interface, ter uma classe auxiliar e na implementação concreta da interface você só chama o método nesta classe auxiliar. Isto simularia a herança múltipla, mas não é muito conveniente, o Java 8 só deu mais conveniência.
O que eu estou tentando, na verdade, é destruir o conceito de herança múltipla que você tem, porque você acha que é possível fazer isto de forma vertical, e herança múltipla é horizontal.
 
te compreendi
voce estava apontando que a classe mamifero em um contexto diferente do resultado final que eu quero, terá o metodo ciclo de vida
o que não deve existir
agora eu te compreendi, mas voce me deixou com mais duvidas ao implementar metodo na interface!!

caso eu tenha as interfaces A e B e ambas com a mesma assinatura e implementados nas proprias interfaces, se uma classe C implementar A e B qual metodo prevalece ?
no caso

interface Teste {
default public void teste() {
System.out.println("david teste");
}
}

interface OutroTeste {
default public void teste() {
System.out.println("david teste outro");
}
}

class NovaClasse2 implements Teste, OutroTeste {
public void outroMetodo2() {
System.out.println("outrometodo2");
}
}
public class HelloWorld {
public static void main(String[] args) {

NovaClasse2 teste2 = new NovaClasse2();
teste2.teste();
}
}
 
2:24 PM
Achei um artigo que fala a respeito, agradeço a atenção bigown, ganhou meu respeito.
 

last day (15 days later) »