Interfaz (programación)
# Interfaz (programación)

En programación orientada a objetos, una interfaz (también llamada protocolo) es un medio común para que los objetos no relacionados se comuniquen entre sí. Estas son definiciones de métodos y valores sobre los cuales los objetos están de acuerdo para cooperar.

Por ejemplo, en Java donde se le llama Interfaz (Java interfaces), la interfaz Comparable especifica un método compareTo que las clases deben implementar. Esto significa que un método aparte de ordenamiento, por ejemplo, puede ordenar cualquier objeto que implemente la interfaz Comparable, sin tener que saber nada sobre la naturaleza interna de la clase (excepto que dos de estos objetos pueden compararse mediante compareTo).

El protocolo es una descripción de:

* Los mensajes que el objeto entiende.
* Los argumentos con los que estos mensajes pueden ser suministrados.
* Los tipos de resultados que devuelven estos mensajes.
* Los invariantes que se conservan a pesar de las modificaciones en el estado de un objeto.
* Las situaciones excepcionales que serán requeridas para ser manejadas por los clientes al objeto.

Si los objetos están totalmente encapsulados, el protocolo describirá la única manera en la cual los objetos pueden ser accedidos por otros objetos.

Algunos lenguajes de programación proporcionan soporte de lenguaje explícito para protocolos o interfaces (Ada, C, D, Dart, Delphi, Go, Java, Object Pascal, Objective-C, PHP, Racket, Seed7, Swift). En C++ las interfaces son conocidas como clases base abstractas e implementadas usando funciones virtuales puras. Las funciones orientadas a objetos de Perl también admiten interfaces.

Aunque Go no se considera generalmente un lenguaje orientado a objetos, permite que los métodos se definan en tipos definidos por el usuario. Go tiene tipos de "interfaz" que son compatibles con cualquier tipo que soporta un conjunto dado de métodos (el tipo no necesita implementar explícitamente la interfaz). La interfaz vacía, interface, es compatible con todos los tipos.

Los lenguajes de programación funcional y programación distribuida tienen un concepto que también se denomina protocolo, pero cuyo significado es sutilmente diferente (es decir, una especificación de intercambios permitidos de mensajes, con énfasis en los intercambios, no en los mensajes). Esta diferencia se debe a suposiciones algo diferentes de programación funcional y paradigmas de programación orientados a objetos. En particular, también se consideran parte de un protocolo en estos lenguajes:

* Las secuencias permitidas de mensajes,
* Restricciones puestas en cualquiera de los participantes en la comunicación,
* Efectos esperados que se producirán a medida que se maneja el mensaje.

Las clases de tipos en lenguajes como Haskell son usadas para muchas de las cosas para las que se usan los protocolos.

