POO en Java (parte II): herencia

by

Introducción

En un artículo anterior empezamos a aproximarnos al concepto de la programación orientada a objetos con Java.

En este artículo continúo ampliando un poco más esa información y viendo otro aspecto fundamental de dicha metodología: la herencia.

Las clases no están aisladas, no son independientes…se relacionan entre ellas y esas relaciones nos ofrecen grandes ventajas, entre ellas la reutilización de código y una mayor organización del mismo.

Algunos de estos tipos de relaciones son:

  • Composición (relaciones tipo tiene-un): Se trata de crearnos clases que tengan entre sus atributos objetos de otras clases. Se utiliza mucho. Ejemplo: tenemos todo lo necesario para manejar una dirección y otra clase que es Usuario. Los usuarios, además de tener sus propias características, tienen una dirección. Con este tipo de relación agrupamos aún más los atributos en clases, haciendo cada una de ellas lo más específica posible.

  • Uso: Hay clases que usan otras clases. Hay clases que ofrecen servicios que otras necesitan. Ejemplo: sobre la clase Dirección anterior, imaginemos que tenemos que comprobar, al intentar crear un objeto tipo Dirección, que el código postal de la dirección que queremos crear es un código postal válido, es decir, corresponde a la ciudad introducida. Podemos tener una clase aparte, llamada, por ejemplo, Validación, que nos lo haga. A su vez, esta nueva clase puede servir para englobar todos los servicios de validaciones que necesitemos.

  • Generalización (herencia, relaciones tipo es-un): Ésta es la que voy a explicar a continuación; si la entendemos bien la utilizaremos correctamente y sacaremos el máximo partido posible a las grandes ventajas que nos ofrece.

Entonces, ¿qué es eso de la herencia?

La herencia facilita mucho el diseño de clases, ya que nos apoyamos en otras ya implementadas, denominadas clases base o clases padre, y en función de ellas derivamos el resto.

Lo que hacemos es generalizar, extraer todas las características comunes de las clases en una clase base. Conseguimos así

  • implementar todo lo necesario para gestionar esas características sólo una vez y reutilizarlo muchas veces (tantas como hijos tenga esa clase que las implementa)
  • mantener una estructura, llamar a lo que es igual de igual manera.

    ¡Calacacín también hereda!

De hecho, todas las clases implementadas en Java siguen una jerarquía…no indicar ningún padre, implica por defecto que el padre de la clase es Object (clase genérica de Java), consiguiendo así una estructura jerárquica global que sirve para organizar todas las clases en un único

“árbol genealógico”.

Una vez diseñada e implementada esa clase base, el resto heredará de ella.Bueno, heredará de ella todo lo que le dejemos heredar, eso sí. Dentro de las clases, indicaremos los permisos que queremos que tengan otras clases de acceso desde fuera de ellas tanto a nivel de atributos(características) como de métodos.

Permisos de las clases

Las clases dan permisos sobre sus atributos y sus métodos. Esos permisos son de tres tipos:

  • Público(public): permiso menos restrictivo, accesibles para todos. Al crearnos un objeto de una clase con atributos/métodos públicos, accederemos directamente a ellos.
  • Privado(private): permiso más restrictivo, sólo accesible dentro de la clase. Al crearnos un objeto de una clase con atributos/métodos públicos, no podremos acceder a ellos. Sólo son accesibles dentro del mismo código de la clase.
  • Protegido(protected): este permiso está pensado para el tema de la herencia. Supone que la clase padre, al tener atributos/métodos protegidos, sólo da permiso de acceso a los mismos tanto desde sí misma como a sus hijos, pero a cualquier clase ajena a ella no.

Ahora sí, vistas las características fundamentales de la herencia, os dejo un código comentado en Java para que lo echeis un vistazo. Tenemos en él la clase base Usuario, las clases derivadas Profesor y Alumno y un ProgramaEjemplo. Hay aspectos puntuales de la herencia que están explicados sobre el código por considerarlos excesivamente específicos y al final un buen ejemplo creo que vale más que mil palabras. :)

Ventajas (información extraída en parte de la wikipedia)

  • Los objetos pueden ser construidos a partir de otros similares. Para ello es necesario que exista una clase base y una jerarquía (relación) de clases.
  • La clase derivada puede heredar código y datos de la clase base, añadiendo código o modificando lo heredado.
  • Las clases que heredan propiedades de otra clase pueden servir como clase base de otras.
  • Mejor modelado de la realidad
  • Evita redundancias, facilitando la reutilización
    En definitiva, ahorraremos código y tiempo.

Desventajas

Una gran desventaja de la herencia en Java es que no soporta herencia múltiple, ésto es, cada clase sólo puede heredar, como mucho, de un único padre. De todas formas, a través de interfaces conseguimos suplir esta carencia. No obstante, el tema de las interfaces lo dejo para otro artículo, que es otro de los aspectos de la programación orientada a objetos que merece artículo aparte.

Conclusiones

La herencia se nos ofrece como un mecanismo de la programación orientada a objetos que nos permite jerarquizar, organizar las clases de forma que reutilicemos el máximo código posible estructurando la información de una forma óptima.

Una vez más, me quedo con cosas por comentar. Unidos a esta aproximación al concepto de herencia me surgen otros de los que hablaré en próximos artículos y que tenemos que tener en cuenta: las clases abstractas y las interfaces, por ejemplo.

Seguiremos con ello en breve. ¡Hasta la próxima!

Advertisement

Etiquetas: , , ,

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s


Seguir

Get every new post delivered to your Inbox.