Polimorfismo ou interface

[quote=wmmartins]Boa tarde pessoal!
Estou buscando as melhores praticas de desenvolvimento web.
Qual é mais usado? Polimorfismo ou Interface?[/quote]

Da uma olhada aqui, talvez ajude.

Abraço :smiley:

[quote=rmendes08][quote=drsmachado][quote=gomesrod][quote=juliocbq]Quero saber na prática. Qual a diferença entre elas?

Escrevi muito software usando c++ e aplicando o conceito de interfaces usando classes 100% abstratas. Por isso questiono a grande diferença entre elas no aspecto computacional e quanto ao uso de uma no lugar da outra.

Qual problema uma resolve que outra não resolveria?[/quote]
O problema que a interface resolve e a classe abstrata não resolve é implementar mais de um contrato na mesma classe. Em C++ o problema não existe por causa da herança múltipla, e por isso a solução (interfaces) também não existe.
Em Java, como por definição só pode herdar de uma classe então as interfaces resolvem a questão dos múltiplos contratos.

E aí por costume/convenção/padronização/boas práticas, usamos interfaces sempre que há necessidade de “herdar” de uma classe 100% abstrata. Em teoria seria necessário apenas quando precisasse herdar de mais de uma…[/quote]
Vamos pegar exemplos práticos. Imagine se o java não tivesse interfaces, apenas classes abstratas. java.util.Comparator e java.io.Serializable não são interfaces, são abstract class.
Agora, como você faria para criar uma classe que fosse, ao mesmo tempo, Comparator e Serializable?
É neste ponto que as interfaces fazem a diferença e se diferenciam das abstract class.[/quote]

Isso é assim apenas porque Java não suporta herança múltipla. Em C++ por exemplo, seria feito exatamente com herança múltipla de classes 100% abstratas.[/quote]
É este o ponto, estamos tratando de java e não C++, as filosofias são diferentes.
Como disse antes, tratando especificamente de orientação a objetos e conceitos, as duas seriam tratadas como uma relação de implementação. Agora, quando focamos em um ponto específico, java ou C++ ou C#, estamos aceitando a filosofia da linguagem de programação.

[quote=drsmachado]Não, não. No caso que citei não estamos tratando de herança, estamos tratando de polimorfismo. Afinal, quero que a classe que eu irei criar tenha as mesmas funcionalidades de uma Serializable (possa ser serializada) e de um Comparator (permita fazer comparações), porém, quero implementar o comportamento de forma específica (o que caracteriza o polimorfismo). A herança é apenas o caminho para isso.
Imagine que, por alguma razão, esta mesma classe precise ser uma AbstractTableModel (que é uma classe abstrata) ou estender alguma outra classe. Todo o resto está perdido, especificamente em java.[/quote]

Tem razão. Isso também acaba abrangendo o escopo de polimorfismo. Dá pra perceber que a principal razão da interface é algo como herança múltipla.

[quote=drsmachado][quote=rmendes08][quote=Luiz Augusto Prado][quote=juliocbq]
Sim, na classe abstrata voce pode adicionar um comportamento mas no final não existe a questão da grande diferença. Nesse caso ai eu poderia extender a classe abstrata de outra abstrata(no lugar da interface). [/quote]

Sim, correto. Mas no caso do metodo abstrato, vc não é obrigado a sobrescrever. Já na interface, é obrigatório.

Bem inteligente seu questionamento. Acho que o java foi feito com essas diferenças entre interface e abstract para facilitar na organização, desenvolvimento e evitar confusões. Eu faço o metodo abstract e evito com o máximo de força não altera-los.

E vc? Pra que utilizaria interfaces? Vc dá preferência por abstracts no lugar de interfaces? [/quote]

Gente, o julio está correto. Na prática, uma interface é uma classe 100% abstrata sim. As diferenças de terminologias vem das diferenças sobre como diferentes linguagens de programação implementam o polimorfismo. Não sei se vocês sabem, mas a POO é muito mais antiga que a linguagem Java. Os próprios padrões GoF são anteriores ao Java. No caso do GoF, os exemplos são mostrados com C++, e veja só, não existe uma sintaxe para definir interfaces em C++, em compensação C++ permite herança múltipla de classe. Assim o mesmo efeito de implementar interfaces do Java é obtido em C++ herdando de classes 100% abstratas.

Mas então, porque Java não fez igual ao C++ ? Para manter a simplicidade. Ao longo do tempo, a herança como é feita em C++ se mostrou supérflua (além de permitir herança múltipla, a herança pode ser public, private ou protected), leva a ambiguidades e é difícil de ser mantida. Me arrisco até a afirmar que o mantra “prefira composição a herança” veio justamente para a turma do C++ fugir da herança múltipla de classe. Ou seja, se o recurso era difícil de implementar e trazia mais problemas do que resolvia, não havia motivo para ser incluído em uma nova linguagem. [/quote]
Claro que está, agora, a aplicabilidade de uma e de outra é diferente, de acordo com o comportamento que o java exige.
Conceitualmente, não há dúvidas que sejam idênticas, mas em java (e provavelmente C#) são diferentes, devido a detalhes específicos.[/quote]

O que muda ali é que c++ permite herança múltipla. A java separou os conceitos que são os mesmos talvez como já disseram por uma questão de organização e visibilidade, mas interface é classe abstrata. Por exemplo, você consegue o polimorfismo com classes abstratas da mesma maneira como com interfaces, mas não consegue a herança múltipla.

[quote=juliocbq][quote=drsmachado][quote=rmendes08][quote=Luiz Augusto Prado][quote=juliocbq]
Sim, na classe abstrata voce pode adicionar um comportamento mas no final não existe a questão da grande diferença. Nesse caso ai eu poderia extender a classe abstrata de outra abstrata(no lugar da interface). [/quote]

Sim, correto. Mas no caso do metodo abstrato, vc não é obrigado a sobrescrever. Já na interface, é obrigatório.

Bem inteligente seu questionamento. Acho que o java foi feito com essas diferenças entre interface e abstract para facilitar na organização, desenvolvimento e evitar confusões. Eu faço o metodo abstract e evito com o máximo de força não altera-los.

E vc? Pra que utilizaria interfaces? Vc dá preferência por abstracts no lugar de interfaces? [/quote]

Gente, o julio está correto. Na prática, uma interface é uma classe 100% abstrata sim. As diferenças de terminologias vem das diferenças sobre como diferentes linguagens de programação implementam o polimorfismo. Não sei se vocês sabem, mas a POO é muito mais antiga que a linguagem Java. Os próprios padrões GoF são anteriores ao Java. No caso do GoF, os exemplos são mostrados com C++, e veja só, não existe uma sintaxe para definir interfaces em C++, em compensação C++ permite herança múltipla de classe. Assim o mesmo efeito de implementar interfaces do Java é obtido em C++ herdando de classes 100% abstratas.

Mas então, porque Java não fez igual ao C++ ? Para manter a simplicidade. Ao longo do tempo, a herança como é feita em C++ se mostrou supérflua (além de permitir herança múltipla, a herança pode ser public, private ou protected), leva a ambiguidades e é difícil de ser mantida. Me arrisco até a afirmar que o mantra “prefira composição a herança” veio justamente para a turma do C++ fugir da herança múltipla de classe. Ou seja, se o recurso era difícil de implementar e trazia mais problemas do que resolvia, não havia motivo para ser incluído em uma nova linguagem. [/quote]
Claro que está, agora, a aplicabilidade de uma e de outra é diferente, de acordo com o comportamento que o java exige.
Conceitualmente, não há dúvidas que sejam idênticas, mas em java (e provavelmente C#) são diferentes, devido a detalhes específicos.[/quote]

O que muda ali é que c++ permite herança múltipla. A java separou os conceitos que são os mesmos talvez como já disseram por uma questão de organização e visibilidade, mas interface é classe abstrata. Por exemplo, você consegue o polimorfismo com classes abstratas da mesma maneira como com interfaces, mas não consegue a herança múltipla.[/quote]

Na verdade, a separação dos conceitos veio na evolução do paradigma OO. Por isso que a publicação dos padrões GoF foi tão importante. Entre os princípios citados pelo GoF, destacou-se a necessidade de separar contrato de operação (interface) de implementação. Entre outras coisas, os padrões do GoF deixam claros que a herança múltipla de implementação, embora possa ser útil em algumas situações, não era um recurso estritamente necessário. Assim, a linguagem Java simplesmente incorporou esses conceitos.

[quote=juliocbq]
O que muda ali é que c++ permite herança múltipla. A java separou os conceitos que são os mesmos talvez como já disseram por uma questão de organização e visibilidade, mas interface é classe abstrata. Por exemplo, você consegue o polimorfismo com classes abstratas da mesma maneira como com interfaces, mas não consegue a herança múltipla.[/quote]

No java vc tem que ir extendendo uma classe de cada vez.
Mas pode implementar quantas quiser.

Esse paradigma é diferente do C++, que permite herança múltipla. Não faz sentido interface em C++.
O C++, nesse aspecto facilita, e realmente acredito que seja por questões de organização e visibilidade.
Em java, eu não sei se uma classe abstrata funcionaria como um “contrato”. Nunca tentei. Sempre usei interfaces.