Interface pq?

10 respostas
LPJava

ae pessoal estou estudando polimorfismo pelo deitel cap 8 sexta edição e me confudi no finalzinho… no inicio ele usa o polimorfismo usando o conceito de herança e tudo mais no final ele vem com o recurso de interface gostaria de saber qual a funcionalidade ele n foi claro… algo que ja reparei no deitel que a medida q ele avança o assunto ele n eh claro se enrola pra explicar… alguem pode me dizer qual a vantagem de usar a interface e pq usa-la n conseguir abstrair essa ideia de polimorfismo com interface :frowning:

10 Respostas

ricardolecheta

Este artigo deve lhe ajudar:
http://www.guj.com.br/java.tutorial.artigo.123.1.guj

Mas falando em linhas gerais, vc utiliza uma interface para definir a “assinatura” de um método.

Por exemplo:

public InterfaceBuscaCarro{
      public Carro buscaCarroPorPlaca(String placa);
}

Isto é uma interface e define apenas a assinatura do método. Alguma classe terá que implementar esta interface e escrever o código.

A implementação pouco lhe interessa, a busca pode ser feita em um arquivo texto, banco de dados ou outro lugar. O importante é que ela retorne um Carro.

No seu código vc vai sempre trabalhar com a interface InterfaceBuscaCarro, nunca com a classe que a implementa. Isto deixa seu código muito mais limpo, claro e desacoplado, uma vez não importa como o método buscaCarro foi implementado, blz?

nilolima
Usando uma interface vc pode abstrair a implementação que será usada em tempo de execução.

Por exemplo eu crio uma interface pessoa e defino que ele vai responder as mesangens getProfissao();

Agora crio duas classes concretas que implemente pessoa. Professor e Policial em cada uma dessas classes deve haver uma implementação de getProfissao();

de forma simples poderia ficar assim:
public interface Pessoa{
	public String getProfissao();
}

public class Professor implements Pessoa{
	public String getProfissao(){
		return "Professor";
	}
}

public class Policial implements Pessoa{
	public String getProfissao(){
		return "Policial";
	}
}

Agora vamos criar um main para ver o polimorfismo funcionar:

public class Policial{
	public static void main(String[] args){
		/*var do tipo da interface para poder receber tanto
			policla como um professor um */
		
		Pessoa p = null;
		
		/* a var p ta recebendo um professor com o 
			polimorfismo o getProfissao() chamado vai 
			ser o da class professor */
		p = new Professor();
		System.out.println(p.getProfissao());
		

		
		/* agora o mesmo p ta recebendo um policial e o
                    getProfissao() chamado é o de policial */	
		p = new Policial();
		System.out.println(p.getProfissao());
		
	}
}

Esse é um exemplo bem simples.
Uma interface é uma class totalmente abstrata que é o supertipo de objetos que recebem mensagens comuns.
Quando vc tiver mais na frente vai ver grandes vantagens nisso.

Valeu espero ter ajudado

ricardolecheta

nilolima, ótimo exemplo. Mas faltou fazer Professor implements Pessoa" :slight_smile:

nilolima

valeu vou corrigir agora

LPJava

po galera valeu ai, pelas dicas, como to ocmeçando agora, deu pra entender legal o funcionamento… entao assim qdo quero criar algo no geral… uso interface… é como os programas que a galera desenvolve em cobol, vb etc… que serve tanto para famarcia qto para padaria… apenas existe uma adaptação… ao sistema…para atender a determinado cliente… o que eu fiquei mais confuso eh a diferença entre polimorfismo… com herança e interface n sao os mesmo?

nilolima

O conceito de polimorfismo tanto com herança como com interface é o mesmo.
O método que será chamado será sempre o da classe que a var refência em tempo de execução.

A

Outra coisa importante para se lembrar é… não existe herança múltipla no Java (e, na minha opinião, não deveria existir mesmo, senão suas classes viram uma zona), porém, uma classe pode implementar quantas interfaces forem necessárias. Isso é uma diferença e pode te ajudar em alguns casos.
A interface serve simplesmente como um contrato para que os outros componentes do seu sistema possam abstrair a implementação, se atendo apenas à estrutura da classe. Na herança, como o próprio nome diz, você herda comportamentos da classe pai. Existe ainda uma outra possibilidade que seria utilizar uma classe abstrata, que nada mais é, na prática, do que a combinação das duas.

Abraço,

Armando

Mantu
Não sei se dá pra estabelecer uma diferença entre polimorfismo e herança... O polimorfismo se manifesta através da herança. Aí, tanto faz se é com interface ou classe. Polimorfismo é tão somente a capacidade de uma mesma referência (uma mesma variável) assumir várias(poli) formas em tempo de execução. Essa capacidade de se transformar(morfo) é dada através de relações de herança, pois só há polimorfismo entre classes/interfaces que tenham algum "parentesco", por assim dizer. Vamos exemplificar isso. Suponha que temos uma classe Animal, e outras duas classes, Cao e Galinha, que herdam da primeira:
class Animal{
	...
	public void morrer() {
		System.out.println("Funções cerebrais encerradas...");
	}
}

class Cao extends Animal{
	...
	public void morrer() {
		System.out.print("CAIN-NHAIN! ");
		super.morrer();
	}
}

class Galinha extends Animal{
	...
	public void morrer() {
		System.out.print("Có-cóóóóóóóó... ");
		super.morrer();
	}
}
Vamos ver agora como se manifesta o polimorfismo. O programa abaixo cria um Animal qualquer e o mata em seguida:
class TesteSemPolimorfismo{
	public static void main(String[] args) {
		Animal animal;
		Cao cao;
		Galinha galinha;
		
		System.out.println("Criando e matando um animal:");
		animal = new Animal();
		animal.morrer();
		System.out.println();
		
		System.out.println("Criando e matando um cão:");
		cao = new Cao();
		cao.morrer();
		System.out.println();
		
		System.out.println("Criando e matando uma galinha:");
		galinha = new Galinha();
		galinha.morrer();
		System.out.println();
	}
}
A saída deste programa será
Criando e matando um animal
Funções cerebrais encerradas...

Criando e matando um cão
Có-cóóóóóóóó... Funções cerebrais encerradas...

Criando e matando uma galinha
CAIN-NHAIN! Funções cerebrais encerradas...
Até aí, nada de novo e, conseqüentemente, nada de polimorfismo. Mas agora, olhe esta outra classe de teste:
01 class TesteComPolimorfismo{
02 	public static void main(String[] args) {
03		Animal animal;
04		
05		System.out.println("Criando e matando um animal:");
06		animal = new Animal();
07		animal.morrer();
08		System.out.println();
09		
10		System.out.println("Criando e matando um cão:");
11		animal = new Cao();
12		animal.morrer();
13		System.out.println();
14		
15		System.out.println("Criando e matando uma galinha:");
16		animal = new Galinha();
17		animal.morrer();
18		System.out.println();
19	}
20 }
Se você acha que vai sair impresso na tela isso:
Criando e matando um animal
Funções cerebrais encerradas...

Criando e matando um cão
Funções cerebrais encerradas...

Criando e matando uma galinha
Funções cerebrais encerradas...
Se enganou... Vai continuar saindo o mesmo texto que saiu da execução da classe TesteSemPolimorfismo! Como isso é possível? Perceba que agora temos apenas uma referência(variável) do tipo Animal. O polimorfismo se manifesta nas linhas 12 e 17. Como? No caso da linha 12, A referência animal, embora seja do tipo Animal, está referenciando um objeto do tipo Cao (veja na linha 11). Quando invoca-se a partir de animal o método morrer(), pensamos que será executado o método morrer() da classe Animal, mas não é isso que acontece. O polimorfismo garante que o método morrer() que foi sobrescrito pela classe Cao (Que é a classe do objeto referenciado) é o que será executado. Note que isso acontece meio por "por debaixo dos panos". O polimorfismo é a capacidade de o compilador/interpretador saber distinguir qual o objeto está por trás de uma referência(variável) e tentar executar os métodos invocados pela referência a partir do objeto. Eu digo tentar, por que se a referencia invocar um método que não está implementado pela classe do objeto, será executado o método da classe da referencia mesmo. Pra ficar mais visível isso tudo, vamos analisar o exemplo acima: Na linha 03, declaramos uma referência chamada animal, do tipo Animal(da classe Animal). Na linha 06, instanciamos um objeto da classe Animal e atribuimo-o à referência animal. Nesse ponto, podemos entender que a referência animal está "apontando" para um objeto do tipo Animal, guardado em memória. Temos então uma referência do tipo Animal e, também, um objeto, em memória, do tipo Animal. Na linha 07, a partir da referência animal, é invocado o me´todo morrer(). As instruções executadas são aquelas escritas no método morrer() da classe Animal, mas não porque a referência animal é do tipo Animal, e sim porque o objeto por ela referênciado é do tipo Animal. Na linha 11, instanciamos um objeto do tipo Cao e atribuimo-o à referência animal. Opa! Pera aí! Que bagunça é essa??? Como pode atribuir um objeto Cao a uma variável do tipo Animal??? Simples: Herança! A herança permite que vc atribua um objeto de uma classe filha/neta/etc à uma referência de classe pai/avo/etc, pois, não podemos esquecer, que a relação de herança é aquela do tipo "é-um". Um Cao é-um Animal, logo podemos muito bem "jogar" um objeto Cao em uma variável Animal. Na linha 12, a partir da referência animal, invocamos novamente o método morrer(), e então, polimorficamente, é verificado se existe tal método implementado pela classe do objeto que tá lá na memória, que é a classe Cao. Como o método morrer() está implementado na classe Cao, são as instruções escritas neste método desta classe que são executadas, e não as instruções do método morrer() da classe Animal. Nas linhas 16 e 17, temos situação análoga: Um objeto Galinha é atribuido a referência animal, da qual se invoca o método morrer(), que é executado, polimorficamente, "na classe" Galinha. Isto é um exemplo de polimorfismo: Uma referência que assume vários formas e comportamentos diferentes durante a execução de um programa. Por isso que não me soa muito bem falar em diferença entre polimorfismo e herança, pois não são dois conceitos comparáveis, e sim complementares entre si.
bzy

Pq o cão cacareja e a galinha late?

Mantu

Por que eu sou desatento demais… só por isso!!! :lol:
Vou arrumar. Desculpem pessoal, e valeu bzy!!! :thumbup:

Criado 2 de setembro de 2006
Ultima resposta 4 de set. de 2006
Respostas 10
Participantes 6