Interface?

7 respostas
J2Alex

Se tem uma coisa que ainda não me entrou direito na cabeça foi o conceito de interface usado em Java.

Por acaso, interface seria uma espécie de “gabarito” de métodos que a classe que implementa a interface deve ter? Sendo assim, sua intenção seria forçar a criação destes métodos, sem os quais a classe se tornaria abstrata e consequentemente o programa não rodaria, já que não posso instanciar uma classe abstrata… estou no caminho certo???

Se for isso mesmo, as classes adaptadoras não quebrariam essa característica? E por que não criar os métodos nas classes diretamente sem a necessidade de implementar uma interface??? :roll:

Vixi… estou confuso… :shock:

7 Respostas

bandrade
bem, eu ainda sou iniciante em java, + acho que funciona assim (um dos experts pode falar melor q eu)

a interface define os metodos que serão implementados por outra classe.

ex.

public interface Conta{}

public class ImplConta implements Conta{}

na interface só estará o escopo dos métodos e na classe ImplConta estarão as implementações dos métodos definidos em Conta. e todos esses métodos em ImplConta devem ser publicos.

se vc tiver que mudar alguma coisa na implementação, vc só muda na classe e não tem que mecher na interface, isso torna o código mais reutilizavel.

espero ter ajudado e estar cert… ehehehe

R

O conceito de interface do java é uma das melhores coisas da linguagem. Com a interface vc obtem um contrato e a permite uma abstração na implementação. exemplo:

eu tenho as camadas

Fachada do sistema
                                      |
                               controlador
                                      |
                         coleção de negócios
                                       |
              [color="red"]Interface do repositório[/color]
                                       |
                            Repositório qualquer

bem assim sua classes de negócio acessa uma interface independente de qual repositório vc use, vc pode fazer vários tipos de repositórios com DB, XML etc.

J2Alex

Bem Richardson,

Pelo que entendi eu posso usar uma camada de negócios e uma camada de acesso a banco de dados, por exemplo e interligar as duas através de uma interface, de modo que a alteração em uma das camadas não afeterá a outra… é isso?

A forma como é feita essa interligação é que me parece confusa. Saberia me dizer onde encontro algum exemplo simples deste tipo de implementação?

Valeu!!!

C

Olá Alex,

Basicamente, quando estamos modelando classes (não só em Java, mas em qualquer linguagem OO), chamamos de interface de um objeto, todos os métodos públicos daquela interface, sendo assim, os métodos privados não importam às classses que se relacionam com aquele objeto, apenas a interface deste objeto importa.

Por exemplo, supondo que você tenha uma classe Funcionario desta forma:

public class Funcionario {
  public double retornaSalario() {
    ....
  }
  
  private double calculaSalarioLiquido() {
    // busca dados da base etc.
  }
}

O método retornaSalario(), por ser público, faz parte da “interface” da classe Funcionario, mas o método calculaSalarioLiquido() não faz. Pouco importa às outras classes do sistema COMO o valor é calculado… o importante é ter acesso à este valor.

Qual a vantagem? Supondo que você seja obrigado a mudar de base de dados, ou mesmo houvesse alterações na forma de cálculo dos salários, você pode alterar os métodos da classe Funcionario (calculaSalarioLiquido()) que fazem estes cálculos, sem a necessidade de alterar sua interface ( no caso, o método retornaSalario()), sendo assim, nenhuma outra classe precisa ser alterada, pois a interface da classe Funcionario não foi alterada, apenas seus mecanismos internos.

Assim, é baseando-se no conceito acima que se utilizam interfaces em Java, supondo que você defina uma Interface chamada Funcionario:

public interface Funcionario {
   public double retornaSalario();
}

Assim qualquer classe que implemente a interface acima, fecha um “acordo” e deve implementar o método retornaSalario(). Desta forma, assim, você não precisa se preocupar com alterações na classe Funcionario, pois o resto do seu sistema só “conhecerá” a sua interface.

Este é um assunto um pouco abstrato e complexo, mas espero ter sido claro, qualquer duvida, estamos ai :wink:
Abraços!

J2Alex

Meu amigo Carlos,

Até entendi o conceito, mas porque não definir diretamente a classe Funcionario ao invés de definir uma interface? Ainda, se a interface mudar - um novo método - não teremos que mudar todas classes que implementam a interface?

E outra coisa: uma classe que implementa uma interface é um tipo desta interface não é? Podemos então declarar objetos do tipo da interface?

Por exemplo, tendo a interface Funcionario, podemos fazer o seguinte:

...
Funcionario funcionario;
...

Isto é válido?

C

Olha, a idéia de interfaces é justo que elas NÃO mudem :slight_smile:
E como se consegue isso? Fazendo uma análise Orientada a Objetos, ou seja, você precisa “modelar” todos os relacionamentos necessários ao seu sistema e modelar interfaces que supram estes relacionamentos.

Obviamente, não dá pra prever o futuro, mas mesmo assim não há necessidade de se ALTERAR a interface, você pode criar uma nova interface que herde de outra interface, adicionando à esta o novo método.

public interface FuncionarioEspecifico extends Funcionario {}

E assim, as classes podem implementar ambas as interfaces (FuncionarioEspecifico e Funcionario).

Quanto ao “porque não definir diretamente a classe Funcionario”, imagine que você tenha uma interface Funcionario, e uma outra classe que implemente esta interface chamada Vendedor e outra chamada Gerente. Ambos são funcionarios, mas recebem de forma diferente.

public class Vendedor implements Funcionario {}
public class Gerente implements Funcionario {}

Assim, você pode ter código como este:

public void mostraInformacoes(Funcionario f);

Que recebe informações de um objeto do tipo Funcionario. Se você fizesse as classes em separado, sem interface, precisaria de dois métodos:

public void mostraInformacoes(Vendedor v);
public void mostraInformacoes(Gerente g);

Você pode sim ter objetos do tipo Funcionario, mas obviamente, só pode instancia-los a partir de classes que implementem a interface Funcionario:

Funcionario f  = new Vendedor();
Funcionario f2 = new Gerente();

Você pode até perguntar, mas eu não poderia utilizar uma classe abstrata para isso? Sim, poderia, mas lembre-se que uma classe pode estender apenas UMA classe… mas pode implementar múltiplas interfaces, obtendo um resultado semelhante ao de herança múltipla, que existe em C++ mas não em Java :wink:

Mais duvidas, continuamos na ativa :wink:
Abraço!

R

No exemplo do repositório sua coleção de dados acessa os métodos da interface e sabe que por exemplo o metodo getUsuarios() retorna uma Collections, e que ele deve chamar esse método para recuperar essa Collection de usuários, independente se do lado do repositório existe um banco SQL, ou um simples txt, pois a interface garante que seja qual for o repositório esse método será implementado. Também no uso de reflection vc vai entender o quanto é importante o uso de uma Interface, esse exemplo que estou tentando te explicar é apenas um entra outros vários motivos.

Criado 24 de janeiro de 2003
Ultima resposta 24 de jan. de 2003
Respostas 7
Participantes 4