Estoy tratando de entender cuáles son los beneficios de usar interfaces para poder saber cuándo y cómo usarlas. La mayoría de las fuentes en Internet son relativamente superficiales y explican cómo funcionan las interfaces, pero ahora por qué usarlas, y cuando busco la pregunta principal, no obtengo ningún resultado que me diga si el propósito de las interfaces se extiende más allá del polimorfismo y herencias múltiples.
Mi razonamiento es que si una interfaz fuera heredada por una sola clase, sería inútil, y cuando una interfaz es heredada por varias clases, no hace ninguna diferencia a menos que se use para el polimorfismo, y lo único que hace que la implementación sea diferente de la extensión. es herencias multiples.
Si supiera con certeza que su propósito se limita a esto, tendría una mayor confianza en mis decisiones de diseño, y si supiera de un propósito fuera de este, llenaría un vacío importante en mi conocimiento. Utilicé la etiqueta de patrones de diseño porque quizás haya un patrón de diseño que haga uso de las interfaces de una manera que claramente va más allá del mero polimorfismo o las herencias múltiples.
si una interfaz fuera heredada por una sola clase, sería inútil
Estoy de acuerdo, pero puede leer mucha discusión sobre este tema en Metodología de interfaces de Java: ¿Debería cada clase implementar una interfaz?
cuando una interfaz es heredada por múltiples clases, no hace ninguna diferencia a menos que se use para polimorfismo
Estoy de acuerdo, sería una tontería implementar una interfaz y luego omitirla invocando sus métodos directamente en la clase concreta. El propósito de implementar una interfaz es llamar a sus métodos abstractos, que es el polimorfismo en acción. Dado que el polimorfismo es la herramienta principal de la Programación Orientada a Objetos, podría llevar esta afirmación un paso más allá y decir que la programación orientada a objetos no hace ninguna diferencia a menos que se use para el polimorfismo .
lo único que hace que la implementación sea diferente de la extensión son las herencias múltiples
No, la principal diferencia entre estas construcciones de Java es que la implementación de la interfaz facilita la herencia sin estado , mientras que la extensión de clase facilita la herencia con estado . Java pasa a admitir la herencia sin estado múltiple y la herencia con estado único. Esta dicotomía puede considerarse un error .
¿Tienen las interfaces algún propósito además de lograr el polimorfismo y la herencia múltiple?
En la práctica, sí. Puede encontrar interfaces utilizadas para otros fines, como interfaces constantes o interfaces de marcador . Se ha debatido si estas prácticas son aconsejables.
Asumiendo que está hablando de la característica del lenguaje (por ejemplo, la palabra clave de interface en Java), a diferencia del término informático general , el propósito de las interfaces es el polimorfismo.
Se puede abusar de una herramienta como las interfaces para otros fines, por ejemplo:
Como una forma de comunicar cosas en común, esto puede ser contraproducente, porque si el polimorfismo no es el objetivo del diseño, entonces las clases que declaran implementar la interfaz se están comprometiendo innecesariamente a implementarla. Eso puede dejar de ser relevante cuando finalmente se rompa la similitud, lo que puede suceder porque las clases no se usan polimórficamente.
Como una forma de documentar el contrato y permitir que cambie la implementación de la clase: en Java, esto se logra con métodos public / protected con Javadoc que son la forma de documentar el contrato. Algunos idiomas ni siquiera tienen eso, y aun así documentan los contratos. Por supuesto, esto solo funciona si el contrato viene en forma de llamadas de función (a diferencia de, por ejemplo, las API RESTful HTTP), y solo funciona si tiene una regla sobre lo que documenta, por ejemplo, el límite del paquete; no querrá crear una interface para cada class , incluso si documenta el contrato para cada clase.
Para ocultar físicamente cosas del consumidor de su interfaz, también se trata de documentar el contrato, pero si su clase tiene datos o métodos protegidos, y desea evitar que algo fuera de su paquete herede, puede exponer solo una interfaz. Pero también puedes usar final .
Las interfaces no están diseñadas para lograr herencia múltiple; más bien facilitan la herencia múltiple solo en la medida en que es útil para el polimorfismo; realmente no le permite heredar ningún campo, y hasta hace poco en Java con métodos predeterminados (por lo tanto, no por diseño ), ni siquiera el código.
Vería, en la naturaleza, paquetes donde solo una clase implementa la interfaz. Eso no hace que la interfaz sea inútil; Es posible que haya más implementaciones en el futuro y, de hecho, es posible que el paquete desee permitir que las personas que llaman ofrezcan su propia implementación.