# Interface (programação orientada a objetos)

Em algumas linguagens de programação, o termo interface (ou protocolo) é uma referência à característica que permite a construção de interfaces que isolam do mundo exterior os detalhes de implementação de um componente de software.

## Utilização

Um exemplo clássico de utilização de interfaces é o do sistema operacional que, através de uma interface de programação de aplicativos, permite que os programas utilizem os recursos do sistema (memória, CPU e etc) sem que os seus detalhes de implementação sejam conhecidos do programador. Este esquema isola e protege o sistema operacional de eventuais erros cometidos pela aplicação.
Os componentes de software utilizam interfaces padronizadas para criar uma camada de abstração que facilite a reutilização e a manutenção do software. Neste cenário, a interface de um módulo de software $A$ deve ser mantida em separado da sua implementação e qualquer outro módulo $B$, que interaja com $A$ (cliente de $A$), deve ser forçado a fazê-lo apenas através da interface. Este mecanismo permite que no caso de uma alteração em $A$, o módulo $B$ continue funcionando; desde que a utilização do módulo $A$ pelo módulo $B$ satisfaça as especificações da interface. (Ver também o princípio da substituição de Liskov).
Uma interface disponibiliza tipos variados de acesso entre componentes, como por exemplo: constantes, tipos de dado, procedimentos, especificação de exceções e assinaturas de métodos. Em alguns casos é mais apropriado definir as variáveis como parte das interfaces. As interfaces também especificam a funcionalidade disponibilizada através de comentários ou através de declarações lógicas formais (assertions).

## Linguagens

O princípio da interface é um alicerce da programação modular que, por sua vez, é precursora e parte da programação orientada a objeto. Na programação orientada a objeto, a interface de um objeto consiste de um conjunto de métodos que um objeto deve suportar. É importante notar que as variáveis de instância não fazem parte da interface de um objeto pois devem ser acessadas somente pelos "métodos de acesso". Historicamente, as interfaces são derivadas dos arquivos de cabeçalho da Linguagem C (normalmente arquivos com extensão ".h") que separam o contexto sintático de um módulo (ou protótipos de funções) da sua implementação.
Algumas linguagens de programação orientadas a objeto exigem que a interface do objeto seja especificada de forma separada da implementação do objeto, enquanto outras não fazem esta exigência. Por exemplo, em linguagens de programação como Objective-C, a classe do objeto define a sua interface e é declarada em um arquivo de cabeçalho (header em inglês) e, por outro lado, a implementação da classe é mantida em um arquivo chamado de "arquivo fonte". Devido à tipagem dinâmica existente na Objective-C, que permite o envio de mensagens para qualquer objeto, a interface de uma classe é importante para determinar para quais métodos um objeto de uma classe responde.
A linguagem de programação Java, que recebeu influência da Objective-C, utiliza outra abordagem para o conceito de interface, assim como outras linguagens orientadas a objeto, onde a interface especifica um conjunto de métodos ou funcionalidades comuns a um conjunto de classes. Ver interface na linguagem Java.
Algumas linguagens de programação como D, Java e Logtalk, por exemplo, permitem a definição de "hierarquias de interfaces". A linguagem Logtalk também suporta a implementação "privada" e "protegida" dos métodos de uma interface.
A linguagem Eiffel inclui na interface de uma classe as pré e pós-condições para execução dos seus métodos. Esta característica é essencial para a metodologia do projeto por contrato, e pode ser entendida como uma extensão das condições impostas pelos tipos dos argumentos. Estas regras podem ser especificadas na implementação da classe ou em uma classe genérica (classe mãe) que não precisa implementar os seus métodos. Elas são extraídas por processadores da linguagem e podem ser vistas em uma ambiente de desenvolvimento além de gerarem verificações em tempo de execução. A linguagem garante que classes derivadas obedeçam aos contratos definidos nas classes que servem de base.

### Suporte à interfaces

Em geral toda linguagem permite a implementação de interfaces. Mas algumas linguagens possuem "construções" específicas para esse fim. Por exemplo:
| ActionScript in Flash Ada C# D Delphi Eiffel Java | Logtalk Mesa ML Modula Modula-2 Modula-3 Oberon | Objective-C PHP Python REALbasic Unified Modeling Language Visual Basic |