JavaRush /Blog Java /Random-ES /Pausa para el café #95. Cómo resolver el problema de here...

Pausa para el café #95. Cómo resolver el problema de herencia múltiple en Java

Publicado en el grupo Random-ES
Fuente: FreeCodeCamp Java es uno de los lenguajes de programación orientados a objetos más populares que se utilizan en la actualidad. Dado que es independiente de la plataforma, puede encontrar aplicaciones Java en cada tipo de dispositivo y en cada sistema operativo. Y como Java es relativamente fácil de aprender, es uno de los lenguajes que muchos programadores dominan. Una característica importante de Java con la que debería estar familiarizado es la herencia de clases. La herencia le permite optimizar su código, facilitando la reutilización de clases. Cuando se puede reutilizar código que ya ha sido probado y depurado, el ciclo de vida del desarrollo de software se vuelve más corto y menos costoso. Pausa para el café #95.  Cómo resolver el problema de herencia múltiple en Java - 1Aunque en teoría es un concepto simple, codificar las relaciones de herencia requiere atención al detalle. Especialmente con respecto a la herencia múltiple, donde una clase secundaria hereda propiedades de varias clases principales. Java rechaza las relaciones de herencia múltiple porque crean ambigüedad, pero hay varias maneras de lograr muchos de los mismos efectos si sabes qué hacer. En este artículo, analizaremos problemas con la herencia múltiple y discutiremos opciones de codificación alternativas en Java.

Terminología de herencia

A veces, para convertirse en un programador exitoso, es necesario convertirse en un solucionador de problemas para encontrar soluciones a errores o problemas comunes. Esta es una parte esencial de la codificación segura e inteligente. Uno de esos problemas está relacionado con la herencia múltiple (o más bien, la falta de ella) en Java. Pausa para el café #95.  Cómo resolver el problema de herencia múltiple en Java - 2Para comprender completamente la herencia en Java, debe estar familiarizado con la terminología básica de herencia de la programación orientada a objetos (POO).
  • Las clases son la estructura de patrones fundamental en los lenguajes de programación orientados a objetos. Una clase define propiedades comunes para un grupo de objetos.
  • Clase principal : también conocida como clases base o superclases. Una clase principal es una clase extensible que proporciona funcionalidad a una clase secundaria. Permite su reutilización. Las definiciones y funciones de la clase principal se reutilizan al crear clases secundarias.
  • Clase secundaria : más genéricamente llamada subclase, una clase secundaria hereda la funcionalidad de otra clase. Las clases secundarias son clases extendidas o derivadas.
  • Herencia : La relación entre las clases padre e hijo.

Tipos de herencia de programación orientada a objetos

Actualmente se utilizan muchos lenguajes de programación orientados a objetos populares, incluidos Java, C++, JavaScript, Python, PHP, Ruby y Perl. Aunque la herencia es un concepto común entre estos lenguajes de programación orientada a objetos, no todos los tipos de herencia existen en cada uno de estos lenguajes. Es extremadamente importante conocer los tipos comunes de herencia y las restricciones de herencia en el idioma específico que esté utilizando. Cuanto más sepa sobre la herencia, más eficaz será su desarrollador. Los tipos de herencia admitidos por Java incluyen:
  • Herencia de un solo nivel : cuando una clase secundaria hereda características de una clase principal única.
  • Herencia multinivel : esta es una forma multinivel de herencia de un solo nivel. En la herencia multinivel, una clase secundaria también puede actuar como clase principal para otras clases secundarias. La relación entre cada nivel es lineal: ninguna rama sube más que con la herencia múltiple. En este caso, la clase secundaria final tiene funciones de todos los niveles superiores.
  • Herencia jerárquica : lo opuesto a la herencia múltiple. En la herencia jerárquica, una clase monoparental tiene más de una clase secundaria. Entonces, en lugar de tener ramas arriba, se ramifica abajo.
  • Herencia híbrida : como sugiere el nombre, la herencia híbrida es una combinación de otros tipos de herencia.
Además de los tipos de herencia enumerados anteriormente, existen otros tipos que Java no admite.
  • Herencia múltiple : en herencia múltiple, una clase secundaria tiene más de una clase principal. Aunque Java y JavaScript no admiten la herencia múltiple, los lenguajes OOP como C++ sí lo hacen.
  • Herencia de rutas múltiples : Un híbrido de herencia múltiple, de múltiples niveles y jerárquica. En la herencia de rutas múltiples, una clase secundaria hereda sus características y funciones de la clase principal y de varias clases secundarias de la clase principal. Dado que la herencia de rutas múltiples se basa en la herencia múltiple, Java no admite su uso.

Por qué Java no admite la herencia múltiple

El principal problema de la herencia múltiple es que puede crear ambigüedades en las clases hijas. En un documento técnico de 1995, el diseñador principal de Java, James Gosling, afirmó que los problemas con la herencia múltiple fueron una de las razones por las que se creó Java. Las complejidades inherentes a la herencia múltiple se ven más claramente en el problema de los diamantes. En el problema del diamante, la clase principal A tiene dos clases secundarias B y C distintas; es decir, las clases secundarias B y C extienden la clase A. Pausa para el café #95.  Cómo resolver el problema de herencia múltiple en Java - 3Ahora creamos una nueva clase secundaria D que extiende tanto la clase B como la clase C. Tenga en cuenta que tenemos herencia múltiple (D extiende B y C), herencia jerárquica (B y C extienden A) y herencia multinivel (D extiende A, B y C). En el problema del diamante, las clases secundarias B y C heredan un método de la clase principal A. Tanto B como C anulan el método heredado. Pero los nuevos métodos de B y C se contradicen entre sí. La clase hija final D hereda dos métodos independientes y en conflicto de sus múltiples padres B y C. No está claro qué método de la clase D debe usarse, por lo que surge la ambigüedad. Otros lenguajes de programación POO implementan diferentes métodos para resolver la ambigüedad de la herencia múltiple.

Cómo resolver el problema de herencia múltiple en Java

El hecho de que la herencia múltiple sea problemática no significa que sea inútil. Hay muchas situaciones en las que es posible que desee que una clase tenga funciones de varias otras clases. Sólo piense en el Tesla Roadster que comprará cuando se convierta en un desarrollador de software de gran éxito. Sus características técnicas se basan tanto en la clase de vehículos deportivos como en la de vehículos eléctricos. Otro ejemplo: el navegador a través del cual estás leyendo este artículo. Tiene características de la clase de soluciones de privacidad de Internet y de la clase de navegadores de Internet generales. Pero no puedes ampliar varias clases en Java. Entonces, ¿cómo aborda este lenguaje el problema de la herencia múltiple? Java utiliza estructuras llamadas interfaces. Las interfaces son tipos abstractos que definen el comportamiento que implementarán las clases. Al ser abstractas, las interfaces no contienen instrucciones detalladas sobre su comportamiento. En cambio, las clases proporcionan implementaciones concretas del comportamiento de la interfaz. Las interfaces tienen varias características definitorias:
  • A diferencia de las clases, no se crean instancias de interfaces. En cambio, las clases implementan interfaces.
  • Las interfaces contienen sólo definiciones de constantes públicas y encabezados de métodos.
  • Las interfaces solo pueden extender otras interfaces, no clases.
  • Las interfaces pueden ampliar múltiples interfaces y las clases pueden implementar múltiples interfaces.
Ahora podemos solucionar eficazmente el problema de los diamantes utilizando interfaces. Recordando que solo las interfaces pueden extender solo otras interfaces, y cualquier clase que requiera múltiples características de herencia debe implementar múltiples interfaces, podemos anular las clases de problemas de diamante. Lo que solían ser las clases A, B y C ahora se convierten en interfaces A, B y C. Las interfaces B y C aún amplían la interfaz A, pero ninguna de estas interfaces tiene una funcionalidad específica, solo comportamientos específicos. La clase D sigue siendo la clase responsable de implementar específicamente el comportamiento encontrado en las interfaces B y C. Tenga en cuenta una diferencia clave: la clase D no extiende las interfaces B y C. En cambio, las implementa. De esta manera, en realidad no tienes herencia múltiple. En lugar de eso, simplemente reformuló el problema.

Conclusión

Comprender la herencia es esencial para cualquier desarrollador Java eficaz. También es igualmente importante conocer las limitaciones de la herencia y la solución alternativa integrada de Java para los problemas tradicionales de herencia múltiple. Aprender a crear interfaces para recrear los efectos de la herencia múltiple en Java mejorará su productividad y sus oportunidades de contratación.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION