Polimorfismo ou interface

Boa tarde pessoal!
Estou buscando as melhores praticas de desenvolvimento web.
Qual é mais usado? Polimorfismo ou Interface?

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.

[quote=douglas_arantes]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.[/quote]

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.

[quote=darklordkamui][quote=douglas_arantes]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.[/quote]

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.

[/quote]

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.

[quote=douglas_arantes]
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.[/quote]

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…

[quote=diogogama][quote=douglas_arantes]
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.[/quote]

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…[/quote]

Diogo, interface e classe abstrata são a mesma coisa propriamente dita. Cai na mesma ladainha de método x funções.

[code]public interface Teste{
public void do();
}

public abstract class Teste{
abstract void do();
}[/code]

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.

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

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.

[quote=juliocbq]
Diogo, interface e classe abstrata são a mesma coisa propriamente dita. Cai na mesma ladainha de método x funções.

[code]public interface Teste{
public void do();
}

public abstract class Teste{
abstract void do();
}[/code]

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.[/quote]

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

[quote=yurifw][quote=juliocbq]
Diogo, interface e classe abstrata são a mesma coisa propriamente dita. Cai na mesma ladainha de método x funções.

[code]public interface Teste{
public void do();
}

public abstract class Teste{
abstract void do();
}[/code]

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.[/quote]

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

[/quote]

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.

1 curtida

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…

[quote=drsmachado]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.[/quote]

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?

[quote=yurifw]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…[/quote]

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.

[quote=juliocbq][quote=drsmachado]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.[/quote]

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?[/quote]
Releia o que eu escrevi, alterei após você ter citado.

[quote=drsmachado][quote=juliocbq][quote=drsmachado]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.[/quote]

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?[/quote]
Releia o que eu escrevi, alterei após você ter citado.[/quote]

Eu reli lá e editei meu post também. Fiz outro questionamento.

Aqui, aqui e aqui existem algumas informações e proposições a respeito.

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.

[quote=juliocbq][quote=diogogama][quote=douglas_arantes]
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.[/quote]

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…[/quote]

Diogo, interface e classe abstrata são a mesma coisa propriamente dita. Cai na mesma ladainha de método x funções.

[code]public interface Teste{
public void do();
}

public abstract class Teste{
abstract void do();
}[/code]

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.[/quote]

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…