"¡Hola, amigo! Hoy me gustaría contarte las razones por las que existen las interfaces. A menudo escuchas que cierta clase, objeto o entidad admite una interfaz en particular. ¿Qué significa admitir una interfaz ? "

Existen interfaces para admitir un comportamiento específico - 1

En un sentido más amplio, cualquier interfaz es un mecanismo para que algo interactúe con otra cosa. Por ejemplo, un control remoto de TV es una interfaz remota. Un perro entiende y ejecuta comandos, lo que significa que el perro admite una interfaz de voz (control). Para resumir todo, podemos decir que una interfaz es una forma estandarizada para que dos cosas interactúen, donde ambas partes conocen el estándar. Cuando una persona le dice a un perro que se "siente", su orden es parte de una «interfaz de control de voz del perro», y si el perro obedece la orden, decimos que el perro apoya la interfaz.

Así es en la programación. Los métodos son acciones realizadas sobre un objeto, sobre sus datos. Y si una clase implementa ciertos métodos, entonces “soporta la ejecución” de ciertos comandos. ¿Qué ganamos al combinar métodos en una interfaz?

1) Cada interfaz , al igual que una clase , tiene un nombre único. Ambas partes pueden estar 100% seguras de que la otra parte admite la interfaz exacta que conocen y no una interfaz similar.

2) Cada interfaz impone ciertas restricciones a una clase que la va a soportar. La clase (su desarrollador) decide qué hará cuando se llame a los métodos heredados de una interfaz, pero el resultado debe estar dentro de los límites de las expectativas razonables. Si le ordenamos a un perro que se "siente" y luego rueda en su lugar durante 5 minutos y luego se sienta, entonces es compatible con la interfaz. Pero si, en cambio, te agarra por la pierna, difícilmente podemos decir que es compatible con la interfaz. Ejecutar el comando no produjo el resultado esperado.

Digamos que tú y tus amigos están escribiendo un juego de computadora. Y te han asignado para programar el comportamiento de un personaje. Uno de sus colegas ya ha escrito un código para mostrar todos los caracteres en la pantalla. Un segundo colega, responsable de guardar el juego en el disco, ha escrito un código para guardar todos los objetos del juego en un archivo. Cada uno de ellos escribió mucho código e hizo una interfaz para interactuar con ese código. Por ejemplo, podría verse así:

codigo Java Descripción
interface Saveable
{
 void saveToMap(Map<String, Object> map);
 void loadFromMap(Map<String, Object> map);
}
— Interfaz para almacenar/cargar un objeto desde un mapa.
interface Drawable
{
 void draw(Screen screen);
}
— Interfaz para dibujar un objeto dentro del objeto Pantalla pasado.
class PacMan implements Saveable, Drawable
{
…
}
— Su clase, que admite dos interfaces.

En otras palabras, para admitir cualquier interfaz (grupo de interfaces), su clase debe:

1) heredarlos

2) Implementar los métodos declarados en ellos

3) Los métodos deben hacer lo que estaban destinados a hacer.

Luego, el resto del código del programa, que no sabe nada sobre su clase y sus objetos, puede funcionar con su clase.

"¿Por qué el código no puede saber nada sobre mi clase?"

"Digamos que tomaste el código de un programa que alguien escribió hace un año. O supongamos que tus amigos compraron u obtuvieron la licencia del motor del juego de otra persona. Tienes un código de trabajo para el juego. Miles de objetos que interactúan entre sí. Y puede interactuar fácilmente con sus objetos si hace que esa interacción suceda a través de interfaces que sus clases han implementado correctamente".

"¡Muy lejos! No sabía que eso era posible".

"Todos los grandes proyectos funcionan así. La gente dejó de escribir desde cero hace mucho tiempo".

La gente tampoco reinventa las matemáticas y el alfabeto cada vez. En cambio, estudian todo lo que se inventó antes que ellos.