Vous êtes sur la page 1sur 18

Taller de Programacin I

Semana VIII

Inicio 10 minutos:
Resumen de la semana anterior

Resumen semana anterior

La clase anterior, creamos clases para la utilizacin de listas.

10 minutos:
Al trmino de la semana

Contenido:
225 minutos.
Material de apoyo:
2 PPT.
1 Gua Prctica.
1 Actividad Propuesta.

Aprendizajes esperados

Aprenders a desarrollar una jerarqua de clases que


permitan utilizar la herencia y los conceptos de sobre
carga y accesibilidad hacia los miembros de una sper
clase.

Herencia

Herencia
Una de las ms poderosas caractersticas de la OO es la herencia, presentando
fundamentalmente una excelente forma de reutilizar cdigo, sin embargo la
herencia va un paso ms lejos y aporta al usuario la posibilidad de crear
relaciones entre clases, no slo con el fin de reutilizar cdigo, sino que mejorar
de manera sustancial el diseo de un conjunto de clases, su organizacin,
agrupacin y definicin de sus comportamientos.
(Definicin) Es la capacidad que tiene las clases de heredar sus atributos,
comportamientos hacia otras clases con el fin de que ellas puedan extender
su funcionalidad.
La herencia es muy beneficiosa cuando existe un conjunto de clases que
contienen funcionalidades y atributos en comn, por ejemplo, si necesitramos
definir dos clases, la primera para crear un objeto de tipo perro, del cual nos
interesa su peso, edad, velocidad mxima al correr y el comportamiento ladrar
y comer.
Y la segunda, una clase que permita crear un objeto del tipo gato, del cual
tambin se desea su peso, edad, cantidad de vidas restantes y sus
comportamientos maullar y comer.
Existe alguna similitud entre ambas clases? Por supuesto que s y esto se
debe a que ambos son mamferos y comparten las propiedades edad, peso
y el comportamiento comer.
Una solucin basada en la herencia a este problema, consiste en agrupar en
una clase todos aquellos elementos que ambos objetos tienen en comn,
esto, con el fin de generar una nica vez los atributos peso, edad y toda la
complejidad que pueda involucrar el comportamiento comer, posteriormente
las clase gato y perro heredaran de la clase mamfero, haciendo que ambas
posean el atributo edad, peso y el comportamiento comer sin necesidad de
volver a codificarlos, de esta forma el gato solo tendr que definir en su propia
clase lo que le falta o especializa.

La herencia al igual que la encapsulacin tambin contribuye a un mejor


control y reduccin de errores, como muestra la imagen anterior, tanto el
perro como el gato tienen edad, peso y comen, sin necesidad de redefinir
dichos atributos y comportamientos en sus clases, debido a que ambos los
poseen por conceptos de herencia desde la clase mamfero, entonces, si es
necesario cambiar la forma en que ellos se alimentan, bastar con cambiar
el mtodo comer una sola vez en la clase mamfero ya que dicho cambio
afectar a ambas clases.
(Importante)Dentro de una jerarqua de clases, se denomina clase padre o
sper clases a aquellas que heredan o entregan sus atributos y
comportamientos hacia otras clases, por otra parte las clases que reciban
atributos y comportamientos desde una clase padre se denominan clases
hijas.
Es importante tambin mencionar que una clase no necesariamente est
obligada a heredar todos sus atributos y/o comportamientos.

Herencia

La siguiente imagen muestra una jerarqua de clases ms extensa como


ejemplo, en el que las clases Gato y Perro, heredan los atributos edad y peso
y el comportamiento de correr y comer desde las clases Terrestre, la que a
su vez posee edad, peso y comer debido a que es una clase hija de Animal.

Herencia

La herencia en programacin se comporta de igual forma que en la vida real,


piensa en la relacin de una madre con su hijo, como todos sabemos, la
madre va a heredar un conjunto de similitudes fsicas con su hijo, color de
pelo, nariz, la forma de la boca y el color de ojos son algunos ejemplos, pero
esto no ser todo, con el tiempo, vers que no slo las caractersticas fsicas
sern heredadas, al tiempo notars que el hijo imita alguno de los
comportamientos de la madre dado que muchas veces la similitud est en la
forma en la que el hijo mira o acta, si bien el hijo acta de forma similar a
la madre, vers que el hijo comenzar a modificar ciertos comportamientos
(los especializa) y adems ir agregando unos nuevos, si lo llevamos al
mundo de la programacin, notars que casi no hay diferencias, si creamos
una clase llamada madre, nivel de felicidad ,el color de ojos y color de pelo
seran sus atributos y comer, divertirse y respirar sus comportamientos, ahora
supongamos que deseamos programar una clase llamada hijo, vers que al
igual que una madre, los atributos y comportamientos entre ambos son muy
similares, por lo que no tiene sentido realizar una copia de ellos en la clase
hijo, a cambio, podemos agregar la herencia lo que da como resultado, que
todos los atributos y comportamientos que la madre tenga, los tendr tambin
el hijo, donde cada uno podr asignar valores y ejecutar comportamientos de
forma independiente.
La sintaxis que permite agregar la herencia es la siguiente:

Mediante la palabra extends le decimos a Java que la clase Hijo hereda de


la clase Madre, esto significa que en la clase Hijo todos los atributos y
comportamientos de la clase Madre estarn disponibles en el hijo. En
programacin a la clase madre se le conoce como sper clase y a las clases
hijas como sub clases. Observa el siguiente cdigo:

Aqu se puede apreciar como mediante la palabra clave this en la clase hijo
se puede utilizar el get del atributo color de pelo, a pesar de que este no est
directamente declarado en la clase y pertenece ahora a ella debido a que es

Herencia

heredado de la clase Madre, mucha atencin con confundirse, si bien el


atributo color de pelo, su get y set estn declarado en la clase Madre, los
comportamientos por concepto de herencia son del hijo, creadas como variables
de instancia en tiempo de ejecucin.
(Importante) Los atributos y comportamientos privados de la clase madre slo
podrn ser llamados desde dentro de la misma, debido a que no son visibles
desde las clases hijas.
A continuacin vamos a ver conceptos ms avanzados de la herencia mediante
un ejemplo, observe el siguiente cdigo, el cual corresponde a una clase
llamada Punto, la cual representa un punto en un plano de dos dimensiones.

En captulos anteriores se recomend que todas las clases tuviesen su


constructor por defecto o sin parmetros, en este caso en particular, dicho
constructor ha sido omitido con el fin ejemplificar un error muy comn en la
herencia que ser tratado ms adelante en este captulo. Mientras tanto
prosigamos en como la clase es utilizada en el mtodo main.

Herencia

Perfecto, hasta aqu tenemos una clase que nos permite crear un punto con
sus respectivas coordenadas y que adems permite reiniciarlo, proceso que
consisten en volverlo a dejarlo en la coordenada (0,0).
Que sucede si agregamos una nueva funcionalidad, la cual consiste en
la ubicacin de un punto en 3D, la pregunta que hay que realizar antes de
comenzar a programar dicha clase, es: hay similitud entre un punto en 3D
y uno en 2D? pues claro, nota que el punto en 3D tambin posee coordenadas
en X e Y agregando slo la coordenada Z, adems el proceso de reiniciado,
es muy similar, la diferencia est en que en punto 3D el mtodo es ms
especializado dado que tambin debe llevar la coordenada Z a cero, o dicho
de otra forma, hay parte de reiniciar en la clase punto que nos sirve en la
clase Punto3D.
Lo primero que debemos hacer entonces es implementar la herencia en la
clase Punto3D, para ello escribimos lo siguiente:

Con esta simple lnea de cdigo ya es posible en punto3D contar con toda
la funcionalidad heredada desde la clase Punto, sin embargo nota que la
lnea que implementa la herencia presenta un error, recuerdas que omitimos
el constructor sin parmetros en la clase punto? Pues bien, esa es la razn
del error que se nos presenta, este error est dado por lo siguiente; una clase
hija que herede de una sper clase, de forma obligatoria necesita que exista
la sper clase primero, as como el hijo, necesita que exista la madre, en este
caso en particular nota que nuestra clase hija no tiene ningn constructor,
esto implica que Java agregar el constructor por defecto a la clase, dada
esta necesidad, cada vez que se aplica la herencia, una clase hija tratar
mediante su constructor por defecto de llamar al constructor sin parmetros
de su clase padre, mientras no se haga una llamada explicita a alguno de

sus constructores, dada esta regla este problema tiene dos soluciones:

Herencia

1)
Realizar desde la clase hija la llamada a un constructor que exista en
la clase padre

Herencia

2)

Agregar el constructor sin parmetros a la clase padre.

(Importante) Note que si no existe el constructor sin parmetro en la clase


padre el cdigo generar un error ya que si bien el constructor es codificado
en la clase hija, no existe una llamada explicita al constructor de la clase
padre, por ende esto tambin asume la llamada al constructor sin parmetro
de la misma.
La palabra reservada super permite a una clase hacer referencia a un miembro
de su clase padre, cuando super va a acompaado de parntesis como se
utiliz en el ejemplo anterior hace referencia al constructor de la clase padre
(recuerde que slo un constructor puede invocar a otro), o tambin puede
utilizarse para realizar la llamada a algn atributo o comportamiento utilizando
el operador . ms el nombre del miembro que se desea llamar.
Comencemos a generar los miembros que se necesitan en la clase 3D,
comenzaremos por definir su atributo y luego, accessadores, mutadores y
constructores:

Herencia

En el cdigo anterior existen 3 puntos importantes que hay que destacar, el


primero, corresponde a la declaracin del atributo Z, ya que X e Y ya estn
declaradas debido a que la clase extiende de la clase Punto.
Lo segundo es referente a la lnea que se encuentra comentada dentro
del constructor por defecto, esta lnea se encuentra comentada dado que es
opcional, tu puedes escoger entre realizar la llamada de forma explcita o no,
sin embargo, para cualquiera de los dos casos el constructor sin parmetros
es llamado siempre y cuando no se realice una llamada explicita a algn
constructor con parmetros,
El tercer punto importante se encuentra en el constructor con parmetros,
nota que recibe tres parmetros, los cuales corresponden a cada una de las
coordenadas, lo interesante est en la reutilizacin del constructor de la clase
padre para asignar los valores a X e Y, y luego se asigna el valor de Z,
tenga en consideracin la utilizacin de super cuando invoca un constructor
siempre debe ser la primera lnea de cdigo del mtodo.
Veamos ahora como luce la utilizacin de nuestra clase en el mtodo main:

Herencia

En el mtodo main, se puede ver como un punto 3D es creado utilizando su


constructor, adems note que luego los comportamientos getX, getY y getZ
son impresos, dando como resultado los valores 4, 6, 8 como muestra de que
sus valores fueron asignados de forma correcta, adems nota que getX y
getY son llamados del objeto p1 de tipo Punto3D, el cual los contiene por
conceptos de herencia.
Sin embargo el problema se suscita en la impresin que viene luego de
reiniciar, dando como resultado 0, 0, 8, esto ocurre ya que el comportamiento
heredado no siempre se ajusta a las necesidades de la clase hija, presentando
en este caso la limitante de que Z no es llevado a cero.

Sobre escritura
Este pequeo inconveniente puede solucionarse agregando al cdigo una
sobre escritura del mtodo reiniciar en la clase Punto3D como muestra la
siguiente imagen.

Herencia

Como puedes ver, el comportamiento ha sido definido otra vez en la clase


Punto3D, la anotacin @override especifica que este mtodo tambin existe
en el padre, esta sobre escritura permite que cuando se llame el
comportamiento reiniciar() de un objeto de tipo Punto3D sea este mtodo el
que se ejecute, ocultando as el del padre, para este caso en particular, parte
de lo que hace la clase padre era til para este caso y por ello se utiliza super
para ejecutar primero el reiniciar del padre, es importante destacar, que en
un mtodo sobre escrito no es obligacin llamar al mtodo que sobre escribe.
Si volvemos a ejecutar el siguiente cdigo:

El resultado ser (0, 0, 0), lo que significa que la sobre escritura ha funcionado.
Recuerda que la herencia puede tener todo los niveles que se desee, por
ejemplo, si creamos una clase que herede de Punto3D y en ella agregamos
una nueva coordenada, tendramos un objeto que permitiese especificar 4
coordenadas. Los comportamientos como getX y getY se encontraran
disponibles en dicha clase dado que la clase Punto se los hereda a Punto3D
y Punto3D le heredar todo lo del Punto en 2D ms todo lo implementado en
la clase 3D hacia nuestra nueva clase, sin embargo, el comportamiento
reiniciar original de la clase Punto, no podr utilizarse en la nueva clase ya
que Punto3D lo ha ocultado, siendo el comportamiento de esta clase el
heredado hacia su clase hija.

final

Herencia

La palabra clave final, es asociada a cuando una variable o mtodo ha llegado


a su forma final, es decir ya no puede cambiar, por ejemplo, si vamos a
nuestra clase 3D otra vez y declaramos la variable z de tipo final, el cdigo
lucir de la siguiente forma:

Herencia

Los errores que aparecen tienen relacin al cambio que se ha realizado en


z, dado que la variable ahora es de tipo final, esto significa no debe haber
ninguna combinacin posible que permita que cuando se instancie la clase
la variable quede sin valor, por ello, el constructor sin parmetro est marcado
con errores, la nica solucin posible es dar un valor por defecto a z como
se indica en la lnea comentada, en el constructor con parmetros, la llamada
al set de Z no es posible de utilizar, ya que Java al no conocer que suceder
en dicho mtodo asume que podra quedar sin un valor, por ello nos obliga
a asignarla de forma directa, por ltimo, el set debe ser eliminado, ya que
carece de sentido, debido a que la variable una vez asignada no puede
cambiar su valor.
La palabra reservada final tambin puede ser utilizada en un comportamiento,
si se hace, dicho comportamiento no podr ser sobre escrito, el siguiente
ejemplo muestra como al definir el comportamiento reiniciar como final en la
clase Punto la clase Punto3D queda sin posibilidad de realizar la sobre
escritura:

Niveles de pensamiento:
CONOCIMIENTO: Repetir.
COMPRENSIN: Transformar.

Ejercicio 01
Duracin: 45 minutos
1._ REPITE los ejemplos dados en esta gua.

2._ TRANSFORMA estos ejemplos, en otros similares.


3._ Haz una DEMOSTRACIN de la utilidad de la herencia,
a travs de una aplicacin sencilla.
4._ INVESTIGA sobre aplicaciones de la herencia.

Niveles de pensamiento:
APLICACIN: Demostrar.
Niveles de pensamiento:
ANLISIS: Investigar.
SINTESIS: Resumir.

Actividades

5._ Haz un RESUMEN de lo aprendido en la semana.

Contenido:
225 minutos.
Material de apoyo:
2 PPT.
1 Gua Prctica.
1 Actividad Propuesta.

Sntesis de la semana VIII: 10 minutos.


Muy bien!... esta semana aprendiste a desarrollar una jerarqua
de clases que permien utilizar la herencia y los conceptos de
sobre carga y accesibilidad hacia los miembros de una sper

Cierre

clase.

Fin Semana VIII

Vous aimerez peut-être aussi