segunda-feira, 27 de fevereiro de 2023

Interface em Java (implements): o que é, para que serve e como implementar - aula 09.1

 O que é uma Interface

O conceito de interface é usando em praticamente toda a computação, até mesmo na engenharia do ramo programação em baixo nível (interface de comunicação entre hardware e o kernel do Sistema Operacional).

Podemos definir interface como uma face, um plano, uma divisa que faz a comunicação entre dois meios diferentes.
Por exemplo, quando trabalhamos com eletrônica, basicamente é tudo estado alto ou estado baixo, que são nada mais que níveis de voltagem ou corrente elétrica. Lá se usa registros, CI (circuitos integrados), portas lógicas, equipamentos de elétrica e eletrônica.

Mas quem usa computador como simples usuário, não precisa saber nem se preocupar com eletricidade ou bits se movendo. Por quê?
Porque há uma interface que interpreta essas coisas em baixo nível. Em vez de te mostrar uma série de bits ou voltagens, te mostra textos que você, humano, compreende.

O responsável por isso é o sistema operacional. É como se ele traduzisse: "Opa, recebi um código aqui do hardware "0011100101001011010", isso quer dizer que tenho que fechar a janela".

Ou seja, estamos fazendo uma comunicação entre dois meios: o meio do hardware (em baixo nível, onde se trabalha com bits) e o meio do usuário (que quer ler textos, ver imagens).
Então, há uma interpretação. No fundo, a mensagem é a mesma, só é dita de maneira diferente para que você possa entender.

Interface em Java


No rigor do termo, uma interface em Java nada mais é que uma classe abstrata composta somente por métodos abstratos. E como tal, obviamente não pode ser instanciada.
Ou seja, ela só contém as declarações dos métodos e constantes, nenhuma implementação, só o 'molde'.

E para que raios serve uma classe sem implementação?
Ela serve para que outras classes, baseadas nessa interface, implementem esses métodos para fins específicos.

Parece confuso e complicado, mas é como explicado anterior sobre interface: ela será uma espécie de comunicação entre meios.
Geralmente entre o que é pedido (das funções que ela executa) e a implementação.

Vamos dar alguns exemplos mais práticos.



Interface de um restaurante

Um exemplo de interface em nosso dia-a-dia, é o cardápio de um restaurante.
No menu do restaurante tem dizendo todas as refeições existentes naquele local, inclusive com os ingredientes.

Os clientes que lá forem vão pedir uma determinada comida, e querem receber exatamente aquilo que pediram. Porém, eles não vão ver e nem se importar de como foi feito o prato, só querem receber aquilo que foi solicitado.

Então, o cardápio é uma interface de comunicação entre o cliente os cozinheiros.


Interface de um programa real

Vamos supor que cientistas te contratem para criar um aplicativo Java para uma universidade, para fazer cálculos com matrizes. Eles irão te passar o que você tem que fazer, porém, muito provavelmente não vão estar interessados em COMO você vai fazer isso, só querem saber se vai funcionar.

E é aí que entra a interface, ela servirá de comunicação entre seu código e os cientistas.
Sua interface vai se comunicar com eles, é como se ela dissesse: "Para criar uma matriz, forneçam isso que te devolvo a matriz. Já para calcular o traço da matriz, nos forneça a matriz. Já para calcular a transposta, faça isso que retorno isso. Ah quer essa informação? Ok, me forneça esses dados que te retorno tudo pronto"

Ou seja, vai haver uma comunicação entre a sua implementação em Java e entre os cientistas.
Provavelmente eles nem sabem programar em Java, por isso eles não devem ter acesso ao código, pois não iriam entender, e nem querem entender, só querem que o programa faça o que eles pedem, e essa mediação é feita através da classe abstrata, a interface Java do programa.

Como declarar uma Interface

Embora seja uma classe abstrata, ela é uma classe abstrata especial, pois só possui métodos abstratos e nada de implementação. Só as estruturas, o cabeçalho dos métodos.

E como tal, vamos usar uma palavra reservada do Java para declarar tais tipos de classe: interface.
Por exemplo, para declarar uma interface pública de nome "JavaProgressivo", fazemos:
public interface JavaProgressivo{
}

Nossa interface do exemplo passado, das matrizes dos cientistas, poderia ser mais ou menos assim:

public interface Matriz {
 
 double Traco(Matriz m);
 Matriz Nula(int linha, int coluna);
 Matriz Transposta(Matriz m);

}

Vejam que não há implementação, só o cabeçalho dos métodos.
Mas vamos ver como essa interface vai se comunicar com os cientistas?

Por exemplo, é fácil ver que se eles quiserem saber o traço de uma matriz, basta invocar o método "Traco()" fornecendo a matriz como argumento.
Como esse traço é calculado? Não sei, não importa, o importante é que retorna uma variável do tipo double com o resultado.

E para criar uma matriz nula de "linha" linhas e de "coluna" colunas?
É só chamar o método Nula() que ele te retorna tal matriz.

E se eles quiserem a matriz transposta de uma matriz 'm', como fazem?
Ué, chamam o método "Transposta()" passando a matriz como argumento, que o programa em Java retorna a matriz transposta.

Implementando uma classe - implements

Porém, de nada adianta ter uma classe abstrata se ela não for implementada.
Veja a interface como um molde, um esqueleto do que você deve fazer.

É como se seu chefe te desse uma série de tarefas para fazer:
Crie um método que retorne o traço de uma matriz
Crie outro método que retorne uma matriz nula de tamanho "linha x coluna"
E outro que retorne a transposta de uma matriz

E para essas tarefas serem resolvidas, é necessário implementá-las.
É aí que entra a parte do código Java, onde você vai realmente programar tudo que foi pedido.

Vamos supor que sua implementação será através da classe pública "minhaMatriz", a sintaxe para implementar uma classe derivada de uma interface é:
public class minhaMatriz implements Matriz{
}

Veja como essa sintaxe se assemelha aquela da Herança.
A única diferença que lá a palavra reservada para herdar é extends.
De resto, tudo igual.

Agora você cria sua classe "minhaMatriz".
Você pode definir novas variáveis, novos métodos (como setters e getters) e fazer tudo o que quiser, com somente uma condição:
Tudo que estiver na interface, tem que estar, obrigatoriamenteem sua implementação, e da mesma maneira.

Ou seja, se lá tem um método que recebe argumentos específicos e retorna um tipo específico, sua implementação tem que obedecer esta mesma regra: receber os mesmos argumentos específicos e retornar o tipo que diz lá.

Seria algo assim:

public class minhaMatriz implements Matriz{
 Matriz mat;
 double traco;
 
 public double Traco(Matriz m){
  //Implementação do traço de uma matriz
  return traco;
 }
 
 public Matriz Nula(int linha, int coluna){
  //Zerando todos os elementos da matriz
  return mat;
 }
 
 public Matriz Transposta(Matriz m){
  //Armazenando a transposta da matriz 'm' na matriz 'mat
  return mat;
 }

}

Nenhum comentário:

Postar um comentário