mi.rodrigues:
Olá, li num livro que o conceito de interface é, pelas minhas palavras: Interface é uma espécie de superclasse, onde ela deve informar quais métodos as subclasses devem suportar, porém, ela não sabe como esse suporte vai ser feito.
Isso é o “pra quê” que interface serve. Queria saber o “por quê” da sua existência… ou estou trocando as coisas? :shock: Eu não consegui entender 100% de interface. Onde estou errando? Grato pela compreensão!
Eu acredito que o melhor jeito de se pensar em uma interface é como um contrato! Quando se faz um contrato, cada cláusula diz exatamente o que deve ser feito, mas não é feito ali. O contrato é sua interface e as cláusulas seriam os métodos dela!
A interface deve ser documentada, ou seja, dizer a responsabilidade da classe e de cada método, o que se espera como resultado ao chama-lo e como um método altera o estado da classe que implementa a interface.
A finalidade da interface é o polimorfismo. Eu posso ter várias implementações de uma interface, mas todas fazem a mesma operação. Como exemplo posso citar as impressoras fiscais. Existe no mercado cerca de um duzia de impressoras fiscais e todas elas realizam as mesmas operações, porém cada uma de uma forma diferente. Uma impressora pode ter o metodo bematechInsereItem e uma outra para fazer a mesma coisa pode necessitar de dois métodos diferentes.
Sendo assim, você teria que criar uma classe para cada impressora e encher o seu código de IFs! A cada impressora que você adiciona-se ficaria pior. O que vc faz então? Cria uma interface para seu sistema utilizar! Cada classe de uma impressora diferente implementaria essa interface e você desacoplaria o seu código a implementação dessas classes.
Para quem está começando isso é um pouco complicado. Existe uma regra que diz “programe para uma interface, não para uma implementação” porém o pessoal acha que isso significa que deve-se criar uma interface para cada classe implementada e isso está errado. Você deve criar uma interface apenas quando necessitar de duas ou mais implementações totalmente distintas. O que a regra quer dizer é que se existe uma interface não use uma implementação concreta dessa interface. Isso se aplica a qualquer coisa. Se você for utilizar um ArrayList, declare a variável como um List! Se você em algum momento necessitar trocar o tipo da variável, digamos por uma LinkedList, só necessita alterar uma linha de código e não em todos os lugares que a variável foi utilizada. É o mesmo principio da impressora fiscal. Se você quiser trocar de impressora, adicionar uma nova, etc. não necessita alterar o código todo!