Boa tarde pessoal!
Estou buscando as melhores praticas de desenvolvimento web.
Qual é mais usado? Polimorfismo ou Interface?
Polimorfismo ou interface
45 Respostas
Parece que você ainda não entendeu o que é polimorfismo e interface.
O uso de interfaces (ou classe abstrata) como um super tipo, lhe propicia desfrutar de um dos principais recursos da Orientação a objetos, que é o polimorfismo.
Qualquer dúvida manda ai, mas o melhor mesmo é pegar um livro e estudar.
Por exemplo Core Java, Head First Java, Java How To Program. Mas pode começar pela ótima apostila FJ-11 da Caelum. Mas antes de estudar OO é bom já ter um boa lógica de programação.
Até mais.
Parece que você ainda não entendeu o que é polimorfismo e interface.O uso de interfaces (ou classe abstrata) como um super tipo, lhe propicia desfrutar de um dos principais recursos da Orientação a objetos, que é o polimorfismo.
Qualquer dúvida manda ai, mas o melhor mesmo é pegar um livro e estudar.
Por exemplo Core Java, Head First Java, Java How To Program. Mas pode começar pela ótima apostila FJ-11 da Caelum. Mas antes de estudar OO é bom já ter um boa lógica de programação.
Até mais.
como assim interface é uma classe abstrata??? acho que vc viajou meu caro…
Interface Funcionam como um tipo de “contrato”, onde são especificados os atributos, métodos e funções que as classes que implementem essa interface são obrigadas a implementar, não há como fazer uma instância de uma Interface e nem como criar um Construtor e Uma interface não é considerada uma Classe e sim uma Entidade.
Classes Abstratas: É usada apenas para ser herdada, funciona como uma super classe, Uma grande vantagem é que força a hierarquia para todas as sub-classes e É um tipo especial de classe que não há como criar instâncias dela.
Resumindo são parecidos mas não são iguais…
E respondendo ao wmmartins ambas são amplamente utilizadas, mas tudo depende do que vc quer fazer.
A classe abstrata serve apenas como modelo para uma classe concreta, não podem ser instanciadas (new), e sempre é herdada por uma classe concreta.
Parece que você ainda não entendeu o que é polimorfismo e interface.O uso de interfaces (ou classe abstrata) como um super tipo, lhe propicia desfrutar de um dos principais recursos da Orientação a objetos, que é o polimorfismo.
Qualquer dúvida manda ai, mas o melhor mesmo é pegar um livro e estudar.
Por exemplo Core Java, Head First Java, Java How To Program. Mas pode começar pela ótima apostila FJ-11 da Caelum. Mas antes de estudar OO é bom já ter um boa lógica de programação.
Até mais.
como assim interface é uma classe abstrata??? acho que vc viajou meu caro…
Interface Funcionam como um tipo de “contrato”, onde são especificados os atributos, métodos e funções que as classes que implementem essa interface são obrigadas a implementar, não há como fazer uma instância de uma Interface e nem como criar um Construtor e Uma interface não é considerada uma Classe e sim uma Entidade.
Classes Abstratas: É usada apenas para ser herdada, funciona como uma super classe, Uma grande vantagem é que força a hierarquia para todas as sub-classes e É um tipo especial de classe que não há como criar instâncias dela.
Resumindo são parecidos mas não são iguais…
E respondendo ao wmmartins ambas são amplamente utilizadas, mas tudo depende do que vc quer fazer.
Onde eu disse que interface é uma classe abstrata? Eu disse que para obter polimorfismo pode se usar uma interface, ou uma classe abstrata.
Em c++ por exemplo não existe interface, mas você pode ter o mesmo resultado de um interface do java, criando uma classe 100% abstrata.
Acho que você ta precisando ler livros como o “design patterns elements of reusable object-oriented software”.
Até mais.
Interface é 100% Classe Abstrata
Todos os métodos da interface são abstratos.
Se uma classe você declarar um apenas um método abstrato, você obrigatoriamente terá que declarar abstract class. De acordo com a kathy sierra, faz muito tempo que estudei isso, mas o que me lembro é isso no momento,
se tiver errado corrigem.
A diferença que uma vc implementa outra vc herda, Na interface você não tem implementação, ja na classe abstrata pode ter implementação de código.
Onde eu disse que interface é uma classe abstrata? Eu disse que para obter polimorfismo pode se usar uma interface, ou uma classe abstrata.Em c++ por exemplo não existe interface, mas você pode ter o mesmo resultado de um interface do java, criando uma classe 100% abstrata.
Acho que você ta precisando ler livros como o “design patterns elements of reusable object-oriented software”.Até mais.
Espera aí, vocês estão doidos??? Interface são classes abstratas??? servem para mesma coisa???
Tem o mesmo comportamento???
Eu acho que vocês devem estudar mais sobre abstração e intarfaces, pois são coisas completamente diferentes usadas para coisas completamente diferentes…
E ae Atexexe vamos acabar com as classes abstratas e interfaces também? rs…
Onde eu disse que interface é uma classe abstrata? Eu disse que para obter polimorfismo pode se usar uma interface, ou uma classe abstrata.Em c++ por exemplo não existe interface, mas você pode ter o mesmo resultado de um interface do java, criando uma classe 100% abstrata.
Acho que você ta precisando ler livros como o "design patterns elements of reusable object-oriented software".Até mais.
] Interface é 100% Classe Abstrata Todos os métodos da interface são abstratos.Se uma classe você declarar um apenas um método abstrato, você obrigatoriamente terá que declarar abstract class. De acordo com a kathy sierra, faz muito tempo que estudei isso, mas o que me lembro é isso no momento,
se tiver errado corrigem.A diferença que uma vc implementa outra vc herda, Na interface você não tem implementação, ja na classe abstrata pode ter implementação de código.
Espera aí, vocês estão doidos??? Interface são classes abstratas??? servem para mesma coisa???
Tem o mesmo comportamento???
Eu acho que vocês devem estudar mais sobre abstração e intarfaces, pois são coisas completamente diferentes usadas para coisas completamente diferentes...
E ae Atexexe vamos acabar com as classes abstratas e interfaces também? rs...
Diogo, interface e classe abstrata são a mesma coisa propriamente dita. Cai na mesma ladainha de método x funções.
public interface Teste{
public void do();
}
public abstract class Teste{
abstract void do();
}
resolvem o mesmo problema.
Ambas são usadas para conseguir polimorfismo(a segunda pode ser implementada para complementar algum comportamento).
O pessoal que tenho visto aí é muito ligado em "terminologias". As coisas são mais simples do que aparentam e algumas pessoas acabam complicando.
Boa tarde pessoal!
Estou buscando as melhores praticas de desenvolvimento web.
Qual é mais usado? Polimorfismo ou Interface?
Não caia nessa de usar x ou y ou vice versa, mesmo lendo em livros. Existem muitas exceções a essas regras. o que você precisa é aprender a discernir a coisa mais adequada ao seu problema.
Use x ou y com convicção.
Diogo, interface e classe abstrata são a mesma coisa propriamente dita. Cai na mesma ladainha de método x funções.public interface Teste{ public void do(); } public abstract class Teste{ abstract void do(); }resolvem o mesmo problema.
Ambas são usadas para conseguir polimorfismo(a segunda pode ser implementada para complementar algum comportamento).
O pessoal que tenho visto aí é muito ligado em "terminologias". As coisas são mais simples do que aparentam e algumas pessoas acabam complicando.
se fossem EXATAMENTE a mesma coisa eu acho q n existiriam interfaces E classes abstratas, apenas um deles xD
por exemplo:
package a;
public interface Interface{
int a=1;
}
package b;
public abstract class ClasseAbstrata{
int a=1;
}
package c;
import a.Interface;
import b.ClasseAbstrata;
public class Teste {
public static void main(String[] args) {
System.out.println(Entidade.a);
System.out.println(ClasseAbstrata.a);
}
}
isso ai de cima n vai compilar, pode existir pouca diferença entre interface e classe abstrata, mas existe sim cara, se fosse só uma questão de terminologia não haveria erro de compilação né?
ps.: em uma interface, atributos sao implicitamente declarados como public e final, e o uso de interface e classe abstrata também ocorre em situações diferentes
Diogo, interface e classe abstrata são a mesma coisa propriamente dita. Cai na mesma ladainha de método x funções.public interface Teste{ public void do(); } public abstract class Teste{ abstract void do(); }resolvem o mesmo problema.
Ambas são usadas para conseguir polimorfismo(a segunda pode ser implementada para complementar algum comportamento).
O pessoal que tenho visto aí é muito ligado em "terminologias". As coisas são mais simples do que aparentam e algumas pessoas acabam complicando.
se fossem EXATAMENTE a mesma coisa eu acho q n existiriam interfaces E classes abstratas, apenas um deles xD
por exemplo:
package a; public interface Interface{ int a=1; }package b; public abstract class ClasseAbstrata{ int a=1; }package c; public class Teste { public static void main(String[] args) { System.out.println(Entidade.a); System.out.println(ClasseAbstrata.a); } }isso ai de cima n vai compilar, pod eexistir pouca diferença entre interface e classe abstrata, mas existe sim cara
E qual o problema de não compilar?
Na prática é a mesma coisa. Você tem um exemplo aí de quando usar uma classe abstrata ou uma interface?
Se existir um bom argumento a gente concorda que é "bem diferente".
Não são a mesma coisa.
Toda interface possui métodos 100% abstratos. A keyword ‘abstract’ é opcional na declaração dos métodos de uma interface, pela mesma razão que explicitar ‘extends Object’ é opcional na declaração de classes que não indicam uma herança em sua declaração. Já na classe abstrata, usa-se explicitamente a keyword, indicando que o método é abstrato.
public abstract class ClasseA{
public abstract void fazAlgo();
}
//
public interface InterfaceA{
public void fazAlgo();
//poderia ser public abstract void fazAlgo();
}
Interfaces não podem possuir implementação de métodos, classes abstratas podem.
public abstract class ClasseA{
public abstract void fazAlgo();
public int contagem(){
return 0;
}
}
//
public interface InterfaceA{
public void fazAlgo();
//Não posso fazer isso
/*
public int contagem(){
return 0;
}
*/
}
Atributos de classes abstratas não são static como as de uma interface.
public abstract class ClasseA{
private int numero = 0;//É simplesmente um atributo que o objeto conterá.
public abstract void fazAlgo();
}
//
public interface InterfaceA{
int numero = 0;//É uma variável estática.
public void fazAlgo();
//poderia ser public abstract void fazAlgo();
}
Não se pode usar modificadores de acesso restritivos, como protected e private em um interface, já em uma classe abstrata, isso é plenamente possível:
public abstract class ClasseA{
protected abstract void fazAlgo();
}
//
public interface InterfaceA{
public void fazAlgo();
//Não poderia ser protected void fazAlgo();
//Não poderia ser private void fazAlgo();
}
Quanto ao uso, o objetivo de usar uma interface é aplicar polimorfismo e garantir o encapsulamento em nível de objetos. Ou seja, eu irei fornecer a quem precisar de uma instância de objeto de alguma classe que implemente minha interface, apenas os métodos que ela pode conhecer. Classes abstratas permitirão o uso de quaisquer métodos cujo acesso seja permissivo para a instância de objeto em questão.
public abstract class ClasseA{
public abstract void fazAlgo();
public int contagem();
}
//
public interface InterfaceA{
public void fazAlgo();
//poderia ser public abstract void fazAlgo();
}
//
ClasseA ca = new ClasseB();
//ca.fazAlgo() e ca.contagem() estão visíveis
//
//
InterfaceA ia = new ClasseB();
//ia.fazAlgo() é o único método visível
Há alguns outros detalhes a mais, mas dizer que “é a mesma coisa” é um erro grosseiro.
então cara, o problema de não compilar é que não compila…
uma interface pode herdar de varias interfaces, uma classe abstrata não pode herdar de nenhuma
uma classe abstrata pode ser utilizada para Hook Methods, uma interface não…
Não são a mesma coisa.
Toda interface possui métodos 100% abstratos. A keyword ‘abstract’ é opcional na declaração dos métodos de uma interface, pela mesma razão que explicitar ‘extends Object’ é opcional na declaração de classes que não indicam uma herança em sua declaração.
Interfaces não podem possuir implementação de métodos, classes abstratas podem.
Atributos de classes abstratas não são static como as de uma interface.
Há alguns outros detalhes a mais, mas dizer que “é a mesma coisa” é um erro grosseiro.
Pior que não é nenhum erro grosseiro(veja bem, estou apenas questionando a pratica entre as duas). Voce disse a mesma coisa que todos os artigos dizem.
uma voce implementa e outra não. Oras, todo mundo sabe disso.
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?
então cara, o problema de não compilar é que não compila…uma interface pode herdar de varias interfaces, uma classe abstrata não pode herdar de nenhuma
uma classe abstrata pode ser utilizada para Hook Methods, uma interface não…
rapaz, isso todo mundo sabe. Quero saber em prática a grande diferença usando em arquiteturas de software.
*esse ponto sobre a herança múltipla é um bom argumento, mas me parece o único e nem tão importante assim.
Não são a mesma coisa.
Toda interface possui métodos 100% abstratos. A keyword ‘abstract’ é opcional na declaração dos métodos de uma interface, pela mesma razão que explicitar ‘extends Object’ é opcional na declaração de classes que não indicam uma herança em sua declaração.
Interfaces não podem possuir implementação de métodos, classes abstratas podem.
Atributos de classes abstratas não são static como as de uma interface.
Há alguns outros detalhes a mais, mas dizer que “é a mesma coisa” é um erro grosseiro.Pior que não é nenhum erro grosseiro(veja bem, estou apenas questionando a pratica entre as duas). Voce disse a mesma coisa que todos os artigos dizem.
uma voce implementa e outra não. Oras, todo mundo sabe disso.
Quero saber na prática. Qual a diferença entre elas?
Releia o que eu escrevi, alterei após você ter citado.
Não são a mesma coisa.
Toda interface possui métodos 100% abstratos. A keyword ‘abstract’ é opcional na declaração dos métodos de uma interface, pela mesma razão que explicitar ‘extends Object’ é opcional na declaração de classes que não indicam uma herança em sua declaração.
Interfaces não podem possuir implementação de métodos, classes abstratas podem.
Atributos de classes abstratas não são static como as de uma interface.
Há alguns outros detalhes a mais, mas dizer que “é a mesma coisa” é um erro grosseiro.Pior que não é nenhum erro grosseiro(veja bem, estou apenas questionando a pratica entre as duas). Voce disse a mesma coisa que todos os artigos dizem.
uma voce implementa e outra não. Oras, todo mundo sabe disso.
Quero saber na prática. Qual a diferença entre elas?
Releia o que eu escrevi, alterei após você ter citado.
Eu reli lá e editei meu post também. Fiz outro questionamento.
na classe abstrata, que pode ser a implementação de uma interface (caso que vou mostrar), pode existir um método onde todas as outras classes que a estendam a execute (sem alteração), mas que contenha em seu interior métodos que devem ser sobrescritos.
exemplo:
public interface Interface
{
public void metodoMutante();
}
public abstract class Abstrata implements Interface
{
public void metodoAbstrato()
{
// chamo meu metodo mutavel
metodoMutante(); // metodo que deve ser chamado, mas com variação dependendo de como é extendido
}
// se eu quiser um metodo metodoMutante implementado aqui, blz. Seria um genérico
}
public class Extendido extends Abstrata
{
@Override
public void metodoMutante()
{
System.out.println("oi 2");
}
}
public class main2
{
public static void main(String ags[])
{
Extendido a = new Extendido();
a.metodoAbstrato();
}
}
vejam que não preciso alterar nada em meu método abstrato.
Onde eu disse que interface é uma classe abstrata? Eu disse que para obter polimorfismo pode se usar uma interface, ou uma classe abstrata.Em c++ por exemplo não existe interface, mas você pode ter o mesmo resultado de um interface do java, criando uma classe 100% abstrata.
Acho que você ta precisando ler livros como o "design patterns elements of reusable object-oriented software".Até mais.
] Interface é 100% Classe Abstrata Todos os métodos da interface são abstratos.Se uma classe você declarar um apenas um método abstrato, você obrigatoriamente terá que declarar abstract class. De acordo com a kathy sierra, faz muito tempo que estudei isso, mas o que me lembro é isso no momento,
se tiver errado corrigem.A diferença que uma vc implementa outra vc herda, Na interface você não tem implementação, ja na classe abstrata pode ter implementação de código.
Espera aí, vocês estão doidos??? Interface são classes abstratas??? servem para mesma coisa???
Tem o mesmo comportamento???
Eu acho que vocês devem estudar mais sobre abstração e intarfaces, pois são coisas completamente diferentes usadas para coisas completamente diferentes...
E ae Atexexe vamos acabar com as classes abstratas e interfaces também? rs...
Diogo, interface e classe abstrata são a mesma coisa propriamente dita. Cai na mesma ladainha de método x funções.
public interface Teste{ public void do(); } public abstract class Teste{ abstract void do(); }resolvem o mesmo problema.
Ambas são usadas para conseguir polimorfismo(a segunda pode ser implementada para complementar algum comportamento).
O pessoal que tenho visto aí é muito ligado em "terminologias". As coisas são mais simples do que aparentam e algumas pessoas acabam complicando.
Então quer dizer que sempre que tem que usar classes abstratas você usa interface e está tudo certo? ou vice-versa e está certo também?
Eu acho que você deve estar viajando mesmo... você pode até achar que elas fazem a mesma coisa, ou melhor, que servem pra mesma coisa, mas não servem... Em alguns casos você pode obter o mesmo resultado com um ou com outro, porém são diferentes e já começa pelo espaço em memória que ocupam.
Dentre as várias coisas que o dsrmachado citou, pra mim, uma das mais importantes diferenças são as implementações...
Espero que não confunda mais...
Ps.: Não é apenas terminologia e sim estudo...
na classe abstrata, que pode ser a implementação de uma interface (caso que vou mostrar), pode existir um método onde todas as outras classes que a estendam a execute (sem alteração), mas que contenha em seu interior métodos que devem ser sobrescritos.exemplo:
public interface Interface { public void metodoMutante(); } public abstract class Abstrata implements Interface { public void metodoAbstrato() { // chamo meu metodo mutavel metodoMutante(); // metodo que deve ser chamado, mas com variação dependendo de como é extendido } // se eu quiser um metodo metodoMutante implementado aqui, blz. Seria um genérico } public class Extendido extends Abstrata { @Override public void metodoMutante() { System.out.println("oi 2"); } } public class main2 { public static void main(String ags[]) { Extendido a = new Extendido(); a.metodoAbstrato(); } }vejam que não preciso alterar nada em meu método abstrato.
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).
Onde eu disse que interface é uma classe abstrata? Eu disse que para obter polimorfismo pode se usar uma interface, ou uma classe abstrata.Em c++ por exemplo não existe interface, mas você pode ter o mesmo resultado de um interface do java, criando uma classe 100% abstrata.
Acho que você ta precisando ler livros como o "design patterns elements of reusable object-oriented software".Até mais.
] Interface é 100% Classe Abstrata Todos os métodos da interface são abstratos.Se uma classe você declarar um apenas um método abstrato, você obrigatoriamente terá que declarar abstract class. De acordo com a kathy sierra, faz muito tempo que estudei isso, mas o que me lembro é isso no momento,
se tiver errado corrigem.A diferença que uma vc implementa outra vc herda, Na interface você não tem implementação, ja na classe abstrata pode ter implementação de código.
Espera aí, vocês estão doidos??? Interface são classes abstratas??? servem para mesma coisa???
Tem o mesmo comportamento???
Eu acho que vocês devem estudar mais sobre abstração e intarfaces, pois são coisas completamente diferentes usadas para coisas completamente diferentes...
E ae Atexexe vamos acabar com as classes abstratas e interfaces também? rs...
Diogo, interface e classe abstrata são a mesma coisa propriamente dita. Cai na mesma ladainha de método x funções.
public interface Teste{ public void do(); } public abstract class Teste{ abstract void do(); }resolvem o mesmo problema.
Ambas são usadas para conseguir polimorfismo(a segunda pode ser implementada para complementar algum comportamento).
O pessoal que tenho visto aí é muito ligado em "terminologias". As coisas são mais simples do que aparentam e algumas pessoas acabam complicando.
Então quer dizer que sempre que tem que usar calasses abstratas você usa interface e está tudo certo? ou vice-versa e está certo também?
Eu acho que você deve estar viajando mesmo... você pode até achar que elas fazem a mesma coisa, ou melhor, que servem pra mesma coisa, mas não servem... Em alguns casos você pode obter o mesmo resultado com um ou com outro, porém são diferentes e já começa pelo espaço em memória que ocupam.
Dentre as várias coisas que o dsrmachado citou, pra mim, uma das mais importantes diferenças são as implementações...
Espero que não confunda mais...
Ps.: Não é apenas terminologia e sim estudo...
Ok, então me mostra um exemplo.
Caramba, só dá maluco… huahuahau…
Se alguém tem alguma dúvida sobre existir diferença só ler aqui…
Quero ver Ataxexe defender agora que tem que acabar com a classe abstrata porque o pessoal confunde… hehehehe…
leia o link que postei e vai poder montar seus próprios exemplos…
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).
Sem contar que só isso já seria uma grande diferença, não?
Aqui, aqui e aqui existem algumas informações e proposições a respeito.
dos que você citou:
o mais plausível seria o uso de interfaces com o design strategy, mas aí entra a questão navamente. Eu posso trocar a interface por uma classe abstrata sem problemas.
este aqui fala o que todo mundo sabe:
este aqui só reforça o meu questionamento:
As general OO terms, the differences are not necessarily well-defined. For example, there are C++ programmers who may hold similar rigid definitions (interfaces are a strict subset of abstract classes that cannot contain implementation), while some may say that an abstract class with some default implementations is still an interface or that a non-abstract class can still define an interface.
Por isso não vejo algo que seja tão em usar interfaces ou classes abstratas(fora conseguir herança múltipla de alguma forma).
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).Sem contar que só isso já seria uma grande diferença, não?
de vantagem, não é não. Existem muitos problemas que dá para substituir interfaces por classes abstratas. O comportamento delas é quase idêntico. A diferença ali seria ao meu ver algo como herança múltipla.
leia o link que postei e vai poder montar seus próprios exemplos…
Diogo, você ainda não entendeu onde eu quero chegar. Eu sei o que teoricamente interfaces e classes abstratas são.
Me fala na prática onde usar uma e onde usar outra, se elas são tão diferentes.
Existe algum problema que se use interfaces que não possam ser resolvidos com classes abstratas?
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).
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?
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).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?
Não dou preferência não. Eu sempre me perguntei isso porque meus projetos pessoais são escritos em c++ onde o conceito de interfaces não existe explicitamente. Consegue-se implementando a classe pura abstrata. Então não faz diferença. Trabalho com java, uso interfaces e classes abstratas de uma maneira em geral. Onde posso colocar um comportamento prioriso a abstrata para escrever menos e deixar o código pequeno.
Diogo, você ainda não entendeu onde eu quero chegar. Eu sei o que teoricamente interfaces e classes abstratas são.
Me fala na prática onde usar uma e onde usar outra, se elas são tão diferentes.Existe algum problema que se use interfaces que não possam ser resolvidos com classes abstratas?
Entendi sim, porém acho que são alhos e bugalhos… Como disse, você até pode resolver uma coisa com qualquer uma das duas, mas cabe a você ver qual seria o melhor para aquele problema…
Interface tem o sentido de contrato (como todos sabem) e classes abstratas de herança… são duas coisas diferentes e para situações diferentes…
É o mesmo questionamento de “prefira composição a herança”, não é que não se resolva qualquer problema com um ou com outro, a questão é a aplicação de uma e de outra…
é praticamente a questão de usar açucar e mel, os dois dão o mesmo resultado mais cada um serve para uma solução diferente de um problema diferente…
Sacou?
Diogo, você ainda não entendeu onde eu quero chegar. Eu sei o que teoricamente interfaces e classes abstratas são.
Me fala na prática onde usar uma e onde usar outra, se elas são tão diferentes.Existe algum problema que se use interfaces que não possam ser resolvidos com classes abstratas?
Entendi sim, porém acho que são alhos e bugalhos… Como disse, você até pode resolver uma coisa com qualquer uma das duas, mas cabe a você ver qual seria o melhor para aquele problema…
Interface tem o sentido de contrato (como todos sabem) e classes abstratas de herança… são duas coisas diferentes e para situações diferentes…
É o mesmo questionamento de “prefira composição a herança”, não é que não se resolva qualquer problema com um ou com outro, a questão é a aplicação de uma e de outra…
é praticamente a questão de usar açucar e mel, os dois dão o mesmo resultado mais cada um serve para uma solução diferente de um problema diferente…
Sacou?
Nesse caso eu acho as duas muito semelhantes. E como pode ver é muito pelo contrário. Não estou dando preferência a nenhuma. Apenas dizendo que a classe abstrata implementa a interface praticamente.
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?
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…
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?
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…
Justamente. Esse é o ponto que frisei lá em cima. Mas fora isso são a mesma coisa(quando usadas para se conseguir polimorfismo).
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?
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…
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.
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?
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…
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.
Isso mesmo. No quesito de herança, pois supre a java com a possibilidade de criar múltiplas delas. No quesito polimorfismo são a mesma coisa. Como c++ permite herança múltipla eu não necessito de interfaces já que posso implementar múltiplas classes abstratas, mas é claro com cuidado para não recair no problema do diamante.
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.
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).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?
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.
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?
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…
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.
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.
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).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?
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.
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.
Boa tarde pessoal!
Estou buscando as melhores praticas de desenvolvimento web.
Qual é mais usado? Polimorfismo ou Interface?
Da uma olhada aqui, talvez ajude.
Abraço 
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?
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…
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.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.
É 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.
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.
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.
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).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?
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.
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.
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.
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).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?
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.
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.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.
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.
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.
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.