Tecnología

Herencia en programación: características, tipos, ejemplos


La herencia en la programaciónorientada a objetos es una forma de organizar los objetos en una jerarquía desde lo más general hasta lo más específico. Es el artilugio utilizado para extender una clase en otra clase, conservando una ejecución análoga.

En la mayoría de los lenguajes orientados a objetos basados en clases, un objeto creado a través de la herencia, llamado objeto hijo, obtiene todas las propiedades y comportamientos del objeto padre.

Por tanto, es una cualidad que representa la relación existente entre diferentes clases. La herencia permite que una clase tenga el mismo comportamiento que otra clase y amplíe o adapte ese comportamiento para brindar una acción especial para necesidades específicas.

La herencia puede ayudar a representar objetos que tengan algunas diferencias y algunas similitudes en la forma en que funcionan. Se puede poner en una clase base toda la funcionalidad que los objetos tengan en común, y luego definir una o más subclases con su propia funcionalidad personalizada.

Índice del artículo

Características de la herencia

La herencia es una de las características claves de la programación orientada a objetos, que sirve para definir una nueva clase a partir de las clases existentes.

Es decir, se pueden derivar nuevas clases de las clases base existentes, agregando nuevas características. No se tiene que escribir desde cero. Por tanto, la herencia proporciona una forma de reutilizar fácilmente el código existente.

Si ya se tiene una clase que haga casi todo lo que se quiere, se podrá crear una subclase en la que se anule parcialmente parte de su comportamiento, o quizás se agregue alguna funcionalidad nueva.

Una clase derivada hereda todos los métodos de la clase base, exceptuando los siguientes:

– Constructores, destructores y constructores de copia de la clase base.

– Operadores sobrecargados de la clase base.

– Funciones amigas de la clase base.

Jerarquía

Tal como lo hace un árbol genealógico, la herencia sirve para conformar una jerarquía de clases. Resulta importante destacar que los atributos determinados para una clase base estarán presentes de forma automática en la clase derivada. Además, los métodos para la clase base funcionarán para las derivadas.

Se dice que una clase será subclase de la clase de la que hereda. Por otro lado, esta clase será su superclase. Se puede referir a la clase más genérica como clase base, por encontrarse en la base de la jerarquía.

Polimorfismo

La herencia es muy popular en algunos lenguajes con tipos estáticos, porque permite que el programador evite algunas de las restricciones del tipo estático.

Un objeto que hereda de otro objeto se considera un subtipo de ese objeto. Un ejemplo podría ser los objetos “instructor” y “estudiante”, cada uno de los cuales hereda de “persona”.

Si instructor y estudiante son del mismo tipo persona, se podrá escribir una función que acepte como parámetro el tipo persona y que funcione en los objetos instructor y estudiante, porque ambos son herederos de persona.

Tipos de herencia

Herencia única

Cuando una clase derivada hereda las propiedades y el comportamiento de una sola clase base. Es decir, una clase se extiende a otra única clase.

Herencia multinivel

Se refiere al artilugio donde se puede heredar de una clase derivada, haciendo que esta clase derivada sea la clase base para una nueva clase. Es decir, resulta cuando se crea una clase derivada a partir de otra clase derivada.

Herencia jerárquica

En esta herencia, muchas subclases heredan de una sola clase. Es decir, sucede cuando una sola clase base es heredada por más de una clase derivada.

Herencia híbrida

Es la herencia resultante cuando se combinan cualesquiera de las tres herencias anteriores (única, jerárquica y multinivel).

Herencia múltiple

Corresponde a la figura de herencia cuando una clase hereda de más de una superclase. El inconveniente existente con este tipo de herencia es que la clase derivada tendrá que tramitar la dependencia que tiene con dos clases base.

Por otro lado, este tipo de herencia permite que los programadores puedan erigir clases que combinen los aspectos de múltiples clases y de sus correspondientes jerarquías.

Tipos de herencia desde una clase base

Herencia pública

Cuando se deriva una clase desde una clase base pública, los miembros públicos de la clase base se convierten en miembros públicos de la clase derivada y los miembros protegidos de la clase base se convierten en miembros protegidos de la clase derivada.

Los miembros privados de una superclase nunca serán asequibles directamente desde una clase derivada, pero se podrá tener acceso a ellos mediante llamadas que se hagan a los miembros públicos y protegidos de la clase base.

Herencia protegida

Cuando se crea una clase que hereda desde una superclase protegida, tanto los miembros públicos como los protegidos de esta superclase se convertirán en miembros protegidos de la clase derivada.

Herencia privada

Al crearse una subclase a partir de una superclase privada, los miembros que son públicos y protegidos de esta superclase se convertirán en miembros privados de la subclase.

Ejemplos

Ejemplo en Python

Para mostrar cómo funciona el principio de herencia se tomarán unos robots o una mejor clase de robots en el lenguaje de programación Python. Para ello se especificará una clase llamada RobotMédico (PhysicianRobot), que se deriva de la superclase Robot.

Si se observa el código de la clase RobotMédico, se podrá apreciar que en esta clase no se ha definido ningún atributo o método.

Como la clase RobotMédico es una subclase de Robot, hereda en este caso tanto el método __init__ como say_hi. Heredar estos métodos significa que se los podrá usar como si hubieran sido definidos en la clase RobotMédico.

Cuando se crea una instancia de RobotMédico, la función __init__ también creará un atributo de nombre. Se podrá aplicar el método say_hi al objeto “y” de RobotMédico, tal como se puede ver en el resultado del código anterior.

Ejemplo en C++

Una clase puede heredar de más de una clase, lo que quiere decir que puede heredar datos y funciones de varias superclases. Para definir una clase derivada, se utiliza una lista de derivación de clase para especificar las clases base.

Una lista de derivación de clase en C++ nombra una o más clases base y tiene la forma siguiente: classderived-class: access-specifierbase-class, en la que access-specifier es public, protected o private, y base-class es el nombre de una clase previamente definida. Si no se usa access-specifier, se toma private por defecto.

Se puede considerar a la superclase “Forma” y su clase derivada “Rectangulo” de la siguiente manera:

Cuando se compila y ejecuta el código anterior, se produce el siguiente resultado: “Área total: 35”.

Referencias

  1. Dave Braunschweig (2020). Inheritance and Polymorphism. Rebus Community. Tomado de: press.rebus.community.
  2. Python Course (2020). Inheritance. Tomado de: python-course.eu.
  3. Data Mentor (2020). R Inheritance. Tomado de: datamentor.io.
  4. Tutorials Point (2020). C++ Inheritance. Tomado de: tutorialspoint.com.
  5. Net-informations (2020). Different Types of Inheritance. Tomado de: net-informations.com.