Leng Aptec101

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 25

Aplicación de Herencia y

Polimorfismo

Landero, P (2021). Aplicación de Herencia


y Polimorfismo [apunte]. Chile. UNAB
Aplicación de herencia y
polimorfismo

1. INTRODUCCIÓN……………………………………………………………………………………
2

2.HERENCIA……………………………………………………………………………………………
3

3
2.1. ¿En qué situaciones se aplica Herencia en la POO?.........................................
2.2. Otros conceptos asociados a la herencia……………………………………………………..…….. 6
- SOBRE ESCRITURA DE MÉTODOS…………………………………………………………………… 6
- CLASE ABSTRACTA………………………………………………………………………………………….9
- INTERFACE……………………………………………………………………………………………………..12
2.3. ¿Cómo programar la Herencia?: Caso Vivienda…………………………………………………… 14

3. POLIMORFISMO…………………………………………………………………………………21

21
3.1. ¿En qué situaciones se aplica Polimorfismo?...................................................
3.2. ¿Cómo programar el Polimorfismo?: Caso Vivienda……………………………………………. 22

23
4. CASO PROPUESTO: Aplicación administrar salas de cine……………………………

1
Aplicación de herencia y
polimorfismo

1. INTRODUCCIÓN

En la unidad anterior aprendimos y aplicamos los principios de abstracción y


encapsulamiento de la Programación Orientada a Objetos. Recuerda que los pilares
fundamentales son: Abstracción -Encapsulamiento – Herencia – Polimorfismo.
También aplicamos los distintos tipos de relaciones entre clases, que es el mecanismo
de comunicación entre los objetos: asociación, agregación y composición. Herencia
también es un tipo de relación. Ya entenderás por qué.

En esta unidad conoceremos y aplicaremos los principios de herencia y polimorfismo


de la Programación Orientada a Objeto.

Herencia tiene que ver con las características y comportamientos que se heredan a
otras clases; y polimorfismo dice relación con realizar una misma acción (o
comportamiento) que aparentemente es la misma, pero en realidad se efectúa de
varias formas distintas (depende de quién recibe la orden de ejecutar esa acción).

Junto a estos conceptos es necesario primero conocer los conceptos de Sobre


escritura, clases Abstractas e Interfaces, para luego pasar a aplicar los conceptos de
herencia y polimorfismo propiamente tal.
2
Aplicación de herencia y
polimorfismo

2. HERENCIA

2.1. ¿En qué situaciones se aplica Herencia y su importancia en la POO?

Imagina el siguiente contexto o situación para una empresa corredora de


propiedades: hemos identificado de esta realidad el objeto casa, por lo tanto,
implementamos la clase Casa con sus atributos, por ejemplo, número, color y número
de habitantes; y sus comportamientos habitar y deshabitar (ver figura siguiente).

Ahora, supón que necesitamos programar un objeto departamento. Sin saber


herencia, me dirías que habría que crear otra clase y copiar todo el código (atributos
y métodos) de Casa a esta nueva clase Departamento, como se indica a continuación:
3

Si adicional a lo anterior, necesitamos cambiar la codificación interna del método


habitar de estos objetos, entonces estaríamos obligados a modificar todas las clases
que tienen dicho método. Lo mismo, si quisiéramos agregar el atributo, por ejemplo,
situación (si está reservada, disponible o habitada), habría que agregar el atributo
en las dos clases (ver figura siguiente).
Aplicación de herencia y
polimorfismo

Peor aún, si tuviéramos que programar el objeto Chalet, entonces tendríamos que
hacer exactamente el mismo trabajo tres veces.

Ahora bien: ¿Cómo resolvemos esto que evidentemente no se está haciendo 4


bien? ¿Cómo reutilizamos lo que ya habíamos programado previamente en
la primera clase Casa?

En esta situación, aparentemente estamos hablando de objetos distintos, pero en


algo se asemejan, ya que los tres poseen los mismos atributos y métodos. Por lo
tanto, en vez de tener tres clases separadas con los mismos atributos y
comportamientos podríamos definir una clase Vivienda que tenga estos elementos
compartidos, y; luego, a partir de vivienda se crean las clases Casa, Departamento
y Chalet, donde cada una puede tener atributos y comportamientos propios (los que
no son heredados) más los heredados de la clase general o principal. La herencia se
representa con una flecha hacia la clase principal desde la clase derivada, como lo
indica la figura siguiente.
Aplicación de herencia y
polimorfismo

Figura 2.1: Ejemplo Diagrama de Clases que representa Herencia donde la clase principal
es Vivienda y las clases derivadas de ella son Casa, Departamento y Chalet.

En resumen, la POO posee uno de sus pilares fundamentales llamado HERENCIA,


que es la propiedad o mecanismo donde se crean una o varias clases a partir de una
5
clase que ya existe. Las nuevas clases se denominan subclases (o clases derivadas)
y la clase principal, a partir de la cual se crean esas subclases, se denomina
superclase (o clase primaria o clase padre). Las subclases contienen atributos y
métodos heredados de la clase padre y, además, pueden definir atributos y métodos
propios distintos a los ya heredados.

Figura 2.2: Ejemplo de definición de subclases y superclase.


Aplicación de herencia y
polimorfismo

En la POO, la herencia es quizás la propiedad más importante, debido a sus grandes


ventajas tales como:
• Jerarquización: La herencia hace posible crear jerarquías que representan
la relación ordenada de las clases que están relacionadas.
• Reutilización de código: A través de la herencia, permite que una parte o
la totalidad de un programa se pueda ocupar en la construcción de otro
programa.
• Ahorro de tiempo: Esto se da como consecuencia de realizar una buena
jerarquización de clases y de la reutilización de código. Con la herencia, se
ahorra tiempo en desarrollo de nuevas clases (subclases) que implementan
datos y métodos propios y, a su vez, heredan datos y métodos de clases bases
(superclases) ya probadas, sin necesidad de añadir o modificar código a las
clases principales.
• Creación de programas extensibles. Es fácil de mantener y ampliar, ya
que para ampliar un programa que utilice herencia simplemente se crea una
nueva clase derivada a partir de la misma clase base. La nueva clase derivada
puede manejarse por el mismo programa sin modificación de las otras clases.
Las clases derivadas pueden convertirse en clases principales de otras clases.
Además, las subclases pueden modificar o sobre escribir uno o varios métodos
(comportamientos) de la clase base, facilitando de esta manera el
polimorfismo.
6
Y puedes aplicar herencia a las situaciones o problemas del mundo cuando
identifiques lo siguiente:
• Existen objetos que tienen los mismos atributos.
• Existen objetos que tienen comportamientos similares.
• Existen distintos tipos de objetos que son “lo mismo” o que cada uno de ellos
pertenece a una clase de objetos que los generaliza a todos.

Finalmente, la herencia puede ser simple o múltiple, simple si una clase se hereda
de una sola clase y múltiple si hereda de varias clases.

2.2. Otros conceptos asociados a la herencia

SOBRE ESCRITURA DE MÉTODOS

La sobre escritura de métodos es un concepto distinto a la sobrecarga de métodos


vistos en apartados anteriores. Voy a recordar lo que es la sobrecarga:

Sobrecarga u Overload de métodos se da cuando existen varios métodos


presentes en una misma clase con el mismo nombre, pero tienen distinto tipo, orden
o número de parámetros. Nosotros hemos utilizado sobrecarga de constructores
cuando definimos más de un constructor por cada clase.
Aplicación de herencia y
polimorfismo

A continuación, te entrego un ejemplo para la clase Coche sobrecargando el método


avanzar():

Ahora bien, la sobre escritura de métodos es diferente, ya que involucra a más


de una clase, por lo general se da en las estructuras de herencia, como lo vimos en
nuestro ejemplo vivienda con el método toString() (ver figura siguiente). En el
ejemplo de la figura tenemos el método toString() en la superclase y cada una de
las subclases heredan este método toString() y, a la vez, cada subclase sobre escribe
dicho método. Cada uno de estos métodos es distinto a nivel de programación. ¿Por
qué sucede esto?:

Si te das cuenta en la programación de cada método, a pesar de que se llamen igual


y que tengan la misma definición de parámetros es necesario agregar atributos
nuevos y mensajes distintos a cada uno, ya que la forma de mostrar los datos es
distinta en cada una de ellas.
Aplicación de herencia y
polimorfismo

Figura 2.3: Ejemplo de sobre escritura método toString

Si programamos el siguiente main:

¿cuál de los tres métodos toString()


crees tú que ejecuta aquí?

¿y aquí? ¿cuál toString() se


ejecuta?
Aplicación de herencia y
polimorfismo

Bueno, en ambos casos se ejecuta el método sobre escrito en cada subclase, como
lo indica la salida siguiente al ejecutar el main:

Si no hubiese existido un método sobre escrito entonces automáticamente ejecutaría


el método toString() que está en vivienda. Prueba esto eliminando el método
toString() que está en la Clase Chalet y vuelve a ejecutar. La salida debiera ser la
siguiente:

Aquí se ejecutó el
método toString() de la
superclase Vivienda.

CLASES ABSTRACTAS 9

Las clases abstractas no representan “algo” o un objeto específico de la realidad.


Una clase abstracta ayuda a la organización de las clases basadas en métodos
comunes que se declaran usando prototipos en una clase que es superclase sin
tener que implementar su código. Sirve para proporcionar una superclase apropiada
a partir de la cual heredan otras clases donde nos permite dar una idea de lo que se
implementará en sus clases derivadas.

Un método se define como abstracto porque en ese momento no se conoce cómo ha


de ser su implementación; serán las subclases de la clase abstracta las responsables
de darle “cuerpo” mediante la sobre escritura de este.

Características:
• Los métodos abstractos contienen solo su declaración o prototipo (nombre y
parámetros). La responsabilidad de implementar su código se delega a las
clases derivadas o subclases.
• Una clase que declare al menos un método abstracto es considerada como
clase abstracta, siendo esa clase abstracta una superclase.
• No es posible crear instancias (objetos) de una clase abstracta. Sin embargo,
es posible crear referencias.
Aplicación de herencia y
polimorfismo

• Las subclases de una clase abstracta están obligadas a sobre escribir


todos los métodos abstractos que heredan. En caso de que no interese
sobre escribir alguno de esos métodos, la subclase deberá ser declarada
también abstracta.
• Una clase abstracta puede tener métodos abstractos y no abstractos.
• Una clase abstracta puede tener constructores.

Imaginemos una clase llamada MedioTransporte, que es una clase muy general ya
que existen demasiados tipos de medios de transporte y, además, el método
avanzar() no es posible implementarlo si no pienso en algún medio de transporte
específico. Por lo tanto, sabemos que el método avanzar() debe existir en esta clase,
pero no sabemos cómo implementarlo. Por otro lado, imagina que esta clase tiene
las clases derivadas Avión y Terrestre donde cada una tiene su propio método
avanzar(). El medio de transporte Avión sí sabemos cómo avanza así que es posible
implementarlo, no así Terrestre, ya que siguen existiendo muchos medios de este
tipo así que no puedo saber cómo implementar el método avanzar, por lo tanto,
Terrestre la definimos abstracta y debo seguir derivando clases hasta implementar
los métodos abstractos definidos en las superclases.

10

Figura 2.3: Ejemplo de clase abstracta MedioTransporte y Terrestre

En la figura las clases que pueden ser abstractas son aquellas que tienen subclases
y que, además, existe al menos un método abstracto. Esto se da en MedioTransporte
y Terrestre. La implementación quedaría algo como lo siguiente:
Aplicación de herencia y
polimorfismo

11
Aplicación de herencia y
polimorfismo

INTERFACES

Una interface comprende un grupo de prototipos de métodos públicos sin


implementar código, de similar forma que los prototipos de métodos de las clases
abstractas. Además, se puede declarar constantes con visibilidad public, static y final 12
con su respectiva inicialización de datos. Los métodos de una interfaz representan un
comportamiento común de un grupo de objetos de varios tipos de clases y que no
necesariamente forman parte de una misma jerarquía.

Las interfaces son unas clases completamente abstractas que contienen solo una
colección de métodos abstractos y propiedades constantes. Al igual que en las clases
abstractas, en una interface se especifica qué se debe hacer, pero no su
implementación. Serán las clases que implementen estas interfaces las que describen
las acciones que puede llevar a cabo un determinado objeto.

En una clase abstracta, además de aparecer los métodos, aparecía el código para
dichos métodos, en cambio, en un interfaz solo existe el prototipo de una función, no
su código. Aquí la diferencia.

La interfaz no es una clase. Las interfaces tan solo pueden contener: métodos
abstractos y constantes. No pueden contener métodos con códigos, constructores o
variables, y por supuesto, no es posible crear objetos de una interfaz.
Aplicación de herencia y
polimorfismo

La sintaxis es la siguiente:
public interface nombre_interface {
//.....
}
dentro de la interfaz se pueden definir constantes, ejemplo:
public static final int maximo = 100;

En la definición de una clase, se utiliza la palabra implements para indicar qué interfaz
se ha de implementar:
public class nombre_clase implements nombre_interfaz {
//.....
}

A la hora de implementar una interfaz hay que tener en cuenta lo siguiente:

• Cuando una clase implementa una interfaz, está obligada a definir el código
(implementar) de todos los métodos existentes en la misma. De no ser así, la
clase debe declararse como abstracta.
• Una clase puede implementar más de una interfaz. En cuyo caso debe
implementar los métodos existentes en todas las interfaces.
public class NombreClase implements Interface1, Interface2,…{
} 13
• Una clase puede heredar otra clase e implementar al mismo tiempo una o
varias interfaces
public class ClaseB extends ClaseA implements Interface1, Interface2{
}
• Una interfaz puede heredar de otras interfaces.
public interface MiInterfaz extends Interface1, Interface2 { }

Diferencias entre interface y clase abstracta:

• Una de las diferencias entre clase abstracta e interface es que todos los
métodos de la interface no tienen definición de su código, mientras que en la
clase abstracta al menos un método es abstracto sin definición de código; eso
implica que otros métodos de la clase sí implementan código.
• Los métodos de una interface son públicos y abstractos por defecto, en el caso
de no indicarse explícitamente. Los datos solo pueden ser constantes públicas,
estáticas y finales.
• Las interfaces no declaran métodos constructores, debido a que solo se
declaran constantes.
Aplicación de herencia y
polimorfismo

• Una clase puede tener herencia múltiple de interfaces, no así con superclases
en que solo es posible herencia simple.
• Las interfaces se usan para publicar el comportamiento común de clases de
distinta jerarquía. También es posible aplicar el polimorfismo de forma similar
a como se aplica en herencia de clases.

2.3. ¿Cómo programar la Herencia?: Caso Vivienda

En este apartado aplicaremos la herencia de clases normales usando el lenguaje


de programación Java donde implementaremos el programar el ejemplo de la
vivienda (ver figura ___). Cabe destacar que en Java solo es posible la herencia
simple; es decir, una clase puede heredarse de solo una clase principal. Los miembros
(datos y métodos) no privados (public, protected, package) son los que se heredan
a las subclases a excepción de los métodos constructores que son los únicos métodos
públicos que no se heredan, debiendo implementarse métodos constructores
para cada clase.

Para programar el ejemplo de la vivienda (ver figura 2.1) donde consideraremos los
siguientes requerimientos de usuario:
• Una vez que se ingrese una vivienda al sistema, inicialmente la situación de
la vivienda será disponible y número de habitantes cero. 14
• El valor del atributo número de habitantes no puede ser menor que cero. El
cero es válido cuando se crea una vivienda, ya que aún nadie la habita.
• La situación de la vivienda solo puede tomar los siguientes valores: ‘D’ (de
disponible), ‘H’ (de habitada y ‘R’ (de reservada).
• Al ejecutar el método habitar una vivienda se debe indicar el número de
habitantes mayor que cero. Retorne verdadero cuando el proceso se genere
exitosamente.
• Al crear un chalet el número de piscinas no puede ser menor que cero. Este
número de piscinas puede aumentar uno en uno según lo que indique el
usuario.

Primero se debe programar la clase principal (o superclase) Vivienda tal como lo has
aprendido hasta ahora:
Aplicación de herencia y
polimorfismo

Al instanciar una vivienda sólo se recibe


el número y el color ya que el número de
habitantes y situación de la vivienda
inicialmente tomarán los valores 0 y ‘D’
respectivamente.

Se actualizan los nuevos valores


solo si son válidos. Para validar se
invocan los métodos respectivos:
15
validarNumHabitantes y
validarSituacionVivienda
Aplicación de herencia y
polimorfismo

A continuación, agregue los customers y los métodos que validan los atributos,
considerando las especificaciones del usuario:

16

Como buena práctica, este método escribirMsj, que


muestra un mensaje al usuario, puede ser invocado
por todos los métodos de esta clase Vivienda y otras
clases que la instancien.
Aplicación de herencia y
polimorfismo

Para probar la clase Vivienda anterior puede usar el siguiente main que fue
programado dentro de la clase AppVivienda.

17

Ahora programaremos las subclases. Debes considerar lo siguiente:


• Las clases derivadas o subclases utilizan la palabra reservada extends
seguida del nombre de la superclase.
• Los constructores reciben los parámetros para inicializar los atributos de la
superclase a través de la palabra reservada super.
• Para invocar a un método de la superclase, desde cualquier clase derivada (o
subclase), debes anteponer al nombre del método la palabra reservada
super.

A continuación, se programan las clases derivadas (o subclases) Casa y Chalet,


dejando como ejercicio propuesto al estudiante la creación de la subclase
Departamento.
Aplicación de herencia y
polimorfismo

Con la instrucción
super(num, col) se invoca
al constructor de la
superclase para enviar los
valores iniciales
requeridos por ésta. Los
constructores se
implementan en la
subclase ya que no se
heredan.

18

Al invocar al método toString() de la superclase debo


anteponer super. De esta forma puedo concatenar los
datos de vivienda y los datos propios de casa.
Aplicación de herencia y
polimorfismo

Lo mismo que en la clase Casa, invoco al


constructor de Vivienda con super(num, col).

Validación necesaria para el atributo


numPiscinas de esta clase Chalet

19

El ejemplo de aplicación anterior es la forma que tiene Java para manejar la herencia,
en otros lenguajes de programación, a diferencia de Java, es posible que una subclase
sea derivada de varias superclases. Para suplir esta necesidad, Java utiliza
Interfaces (se verá en el siguiente apartado).
Aplicación de herencia y
polimorfismo

Finalmente, para probar esta implementación de herencia, los objetos que se crean
son de las subclases Casa y Chalet, y a partir de estas se pueden invocar a los
métodos de las mismas y los de la superclase Vivienda. Les dejo un ejemplo de main
de prueba:

Se crea un objeto de la
subclase Casa y a partir de
este objeto se interactúa
(relación) con la superclase
vivienda.

Los métodos escribirMsj y


habitar (como otros
ocupados más adelante) no
están definidos en la subclase
Casa, pero si fueron
heredados.

20
Aplicación de herencia y
polimorfismo

La salida que se genera al ejecutar el main anterior es la siguiente:

Es su turno ahora programar este ejemplo agregando además la subclase que nos
faltó: Departamento. Recuerda también probar los métodos de esta en el main.
Cualquier duda que tengas no olvides preguntar en el foro habilitado en la plataforma
de la asignatura.

3. POLIMORFISMO

3.1. ¿En qué situaciones se aplica Polimorfismo?

Junto con los principios de Abstracción, Encapsulamiento y Herencia existe un 21


principio muy importante en la programación orientada a objeto llamado
Polimorfismo. Esta es la propiedad que permite que un objeto pueda realizar el
mismo comportamiento de muchas formas.
Aplicación de herencia y
polimorfismo

Para aplicar polimorfismo debe existir lo siguiente:

• Que exista herencia.


• Que existan métodos iguales, pero de distintas formas (distinta
programación), tanto en el padre como en los hijos.
• El comportamiento definido en la subclase que va a tomar el objeto de la
superclase dependerá del contexto.

Las ventajas de utilizar el polimorfismo en la POO son:


• Programas concisos, es decir, códigos más cortos de lo que podrían ser.
• Programas modulares: Las partes del código que no están relacionadas se
mantienen separadas, fáciles de modificar y adaptables.
• Ahorro de tiempo: Esto se da como consecuencia de realizar una buena
jerarquización de clases y de la reutilización de código.
• Generalizar: Nos permite programar en forma general, en lugar de hacerlo
de modo específico.

Existen distintos tipos de polimorfismo. Nosotros hablaremos solo del polimorfismo


dinámico donde involucra la herencia y métodos iguales en distintas clases.

3.2. ¿Cómo programar el Polimorfismo?: Caso Vivienda


22
Tomemos el mismo ejemplo de la clase vivienda (ver figura 2.1). Tiene los atributos
y métodos que ya mencionamos y, además, hemos agregado otro método llamado
mostrarDatos. Este será el comportamiento que un objeto de la superclase podrá
instanciar.

Como sabemos, esta clase Vivienda tiene tres subclases: Casa, Departamento y
Chalet, por lo tanto, aquí existe una relación de herencia que es determinante para
aplicar polimorfismo. También sabemos que el método mostrarDatos en Vivienda
se hereda a las subclases.
Aplicación de herencia y
polimorfismo

Aparte de que las subclases heredan el método mostrarDatos, cada una de ellas
sobrescribe este mismo método. Como se muestra en la figura siguiente:

A partir de una relación de herencia, un método heredado es además sobrescrito por


cada una de las subclases. Lo único que debes hacer para probar el polimorfismo (en 23
el main), es crear un arreglo de tipo Vivienda y para este arreglo agregue objetos
casa, departamento y chalet. En un ciclo for recorra el arreglo y ejecuta el método
mostrar datos dentro del ciclo.

4. CASO PROPUESTO: Aplicación administrar salas de cine

Para este caso (redactado el apunte de la unidad uno) aplica herencia y polimorfismos
en la siguiente situación.

• Las salas de cines se definen en una clase general. Defina atributos que
caractericen a las salas de cine en general (número, cantidad de butacas y
ubicación) y un método abstracto para que se implemente en las subclases.
El método debe ser: agregar persona a la sala.

• Indique al menos 3 subclases con atributos propios y el método que debe ser
implementado para las tres subclases.

• Aplique herencia y polimorfismo juntos. El polimorfismo puedes aplicarlo al


método abstracto agregar persona a la sala donde este método (que
Aplicación de herencia y
polimorfismo

aparentemente es igual) debe ser diferente para los 3 tipos de salas que
definas.

Antes de implementar el caso diseña tu diagrama de clases y súbelo al foro


para que lo retroalimenten tus compañeros y docente.

24

También podría gustarte