[MÚSICA]
[MÚSICA]
Hola,
en esta oportunidad
profundizaremos un poco más en los temas relacionados con la herencia,
para esto revisaremos los temas de clases y métodos abstractos,
polimorfismo y la clase Object,
aprenderemos a usar la instrucción instanceof,
revisaremos el concepto de generics,
aprenderemos el uso de una interface
y aprenderemos sobre colecciones e iteradores.
Iniciemos con el tema de métodos y clases abstractas,
recordemos que previamente habíamos definido una relación de herencia
para modelar los diferentes tipos de recetas que sabe preparar nuestro cocinero,
en particular, habíamos definido dos agrupaciones para las recetas,
comidas y bebidas,
en nuestra solución actual tenemos entonces
la clase de comida de la cual heredan todas las comidas que sabe preparar el cocinero
y la clase de bebida de la cual hereda todas las bebidas que sabe hacer.
Recordemos que estas clases nos permiten agrupar el comportamiento común
usando, por ejemplo, atributos que se pueden compartir con sus clases hijas.
Sin embargo,
con esta solución existe la posibilidad de crear instancias de la clase comida
y de la clase bebida,
pero esto no tiene mucho sentido,
ya que, por ejemplo, la comida es un concepto abstracto
que nuestro cocinero no puede preparar y un cliente no puede consumir.
El cocinero puede preparar una receta concreta,
es decir, una pizza o una carne, por ejemplo.
Para evitar este inconveniente,
podemos aprovechar el concepto de clases abstractas,
estas clases tendrán la misma funcionalidad de las clases comida y bebidas
y nos permitirán agrupar comportamiento común,
por ejemplo, con atributos compartidos.
Igualmente nos permitirán definir métodos comunes a todas las clases hijas.
Sin embargo, no permite la creación de instancias,
ya que como su nombre lo indica, hacen referencia a un concepto abstracto
del cual no se pueden crear objetos concretos.
veamos cómo se declara una clase abstracta.
Hasta ahora para declarar una clase hemos indicado su visibilidad
usando por ejemplo la palabra public,
hemos indicado que es una clase y posteriormente hemos indicado su nombre.
Para declarar una clase abstracta reemplazaremos la palabra class,
por las palabras abstract y class.
Veamos un ejemplo,
declaremos
la clase bebida,
indicaremos que la visibilidad en este caso es pública,
indicaremos que es una clase abstracta usando la palabra abstract
y posteriormente indicaremos la palabra class,
pondremos su nombre
que en este caso es bebida y no olvidemos abrir y cerrar llaves
para escribir entre ellas el cuerpo de la clase.
Para la declaración de las clases hijas, por ejemplo, en la clase té,
no debemos hacer ningún cambio, simplemente seguimos indicando que hereda de bebida,
hasta el momento no hemos hecho mayor cambio,
ya que el cuerpo de las clases bebida y comida seguirá siendo el mismo
y la relación de herencia también,
lo único nuevo es que no podemos crear objetos de comida y bebida.
Aprovechemos un poco más el concepto de clases abstractas
y tratemos de resolver un nuevo requerimiento.
Ahora, nos han solicitado poder conocer el tiempo de preparación
de cada una de las recetas que sabe hacer el cocinero.
Una primera solución puede ser crear un método
y algunos atributos, si es necesario, en cada clase
que representa una receta.
Esto quiere decir que cada clase conocerá su tiempo de preparación y lo podrá indicar.
Sin embargo, esta solución genera un riesgo,
ya que debemos ser cuidadosos de agregar la información
del tiempo de preparación
cada vez que creemos una nueva clase que represente una receta,
un comentario general sería que podríamos tener la información en cada clase,
pero cada una de ellas podria entregarla de manera diferente,
una, por ejemplo, un método de dar tiempo,
otra es un método de dar tiempo preparación
y así sucesivamente.
Una solución a este problema
puede ser, aprovechar la relación de herencia,
la cual nos permite agrupar comportamiento común,
ya sabemos definir atributos compartidos,
pero ahora queremos asegurar que todas las clases tendrán el mismo método,
es decir, con el mismo nombre,
sin embargo, el cuerpo podrá variar,
ya que puede ser diferente la forma en que se calcula el tiempo de preparación
de una pizza y el tiempo de preparación de un pan.
Para esto definiremos un método abstracto en las clases abstractas,
el cual nos permitirá forzar a que todas las clases hijas tengan el mismo método,
pero sin necesidad de implementar su cuerpo.
Veamos cómo se implementa un método abstracto,
definiremos una visibilidad,
la cual puede ser publica o protegida,
indicaremos que es un método abstracto, usando la palabra abstract,
indicaremos el tipo de retorno, el nombre del método,
los parámetros que requiere
y finalizaremos con un punto y coma.
Esto quiere decir que la declaración del método sólo tendrá la asignatura,
no tendrá ningún cuerpo,
esto se debe a que serán las clases hijas las que se encarguen de implementar
el cuerpo de este método.
Veamos un ejemplo,
declarando un método abstracto
para informar el tiempo de preparación de la clase bebida.
Recordemos la declaración,
indicaremos para este caso que la visibilidad es pública,
usaremos la palabra abstract para indicar que es un método abstracto.
Digamos que retorna un valor de tipo entero,
el cual corresponde a los minutos que toma la preparación,
asignaremos como nombre, dar tiempo de preparación
y diremos que se requiere conocer la cantidad de porciones
para poder informar el tiempo de preparación.
No olvidemos que como solo debemos declarar la asignatura,
terminaremos con punto y coma,
de esta forma obligaremos a que todas las clases hijas de bebida tengan este método,
por ejemplo, la clase Té,
lo deberá tener e implementar su cuerpo.
En este caso, hemos dicho que preparar un Té toma dos minutos por cada porción,
es importante notar que en la asignatura del método
en la clase Té no aparece la clase abstract,
esto se debe a que esta clase sí ha implementado un cuerpo
para este método.