Este documento trata sobre la herencia en programación orientada a objetos. Explica que la herencia permite que una clase herede características de otra clase existente, lo que facilita la reutilización de código. También describe los tipos de herencia, especialmente la herencia simple y múltiple, y cómo se aplica la herencia en Java, incluyendo la redefinición de métodos y el uso de clases y métodos abstractos. Finalmente, propone un ejercicio sobre diseño de un ecosistema que ilustra el uso de la herencia.
1. 1
Tema 7 - Herencia
Luis Gonzaga Pérez Cordón
Índice
Definición
Ventajas
Situaciones en las que se aplica la herencia
Tipos de Herencia
Herencia en Java
Definición
La herencia es un mecanismo de la P.D.O.
que permite construir una clase incorporando
de manera implícita todas las características
de una clase previamente existente.
Ejemplo
A
B
A es un ascendiente o superclase de B. Si la
herencia entre A y B es directa decimos que A es
la clase padre de B
B es un descendiente o subclase de A. Si la
herencia entre A y B es directa decimos además
que B es una clase hija de A
2. 2
Ventajas
Modelado de la realidad: las relaciones de
especialización/generalización entre las
entidades del mundo real.
Evita redundancias
Facilita la reutilización
Sirve de soporte para el polimorfismo
Situaciones en las que se aplica la
herencia
Situaciones:
Especialización
Extensión
Especificación
Construcción ?????
Situaciones en las que se aplica la
herencia
Especialización: Dado un concepto B y otro
concepto A que representa una
especialización de B, entonces puede
establecerse una relación de herencia entre las
clases de objetos que representan a A y B.
Vehículo
Coche
A es un B: un Coche es un Vehículo
Situaciones en las que se aplica la
herencia
Extensión: una clase puede servir para
extender la funcionalidad de una superclase
sin que represente necesariamente un
concepto más específico.
Vendedor
VendedorConVehículo
3. 3
Situaciones en las que se aplica la
herencia
Especificación: Una superclase puede servir
para especificar la funcionalidad mínima
común de un conjunto de descendientes.
ObjetoGrafico:
seleccionar
mover
escalar
cambiarColor
Texto Línea Cuadrado
Situaciones en las que se aplica la
herencia
Construcción: Una clase puede construirse a
partir de otra, simplemente porque la hija
puede aprovechar internamente parte o toda la
funcionalidad del padre, aunque representen
entidades sin conexión alguna.
Lista
Pila
Situaciones en las que se aplica la
herencia
Construcción: ¡¡MAL USO DE LA
HERENCIA!!. No se debe emplear en estos
casos. Si necesita la funcionalidad de una lista
debe USAR una lista, no HEREDAR de una
lista.
Situaciones en las que se aplica la
herencia
Ejemplo:
Cuenta
------------------
long numero;
String titular;
double saldo;
double interes;
----------------
ingreso()
ingresoInteresMes();
leerSaldo();
transferirA();
CuentaCorriente
-----------------
Reintegro();
CuentaAhorroPFijo
--------------------
Date vencimiento;
--------------------
ingresoMes();
PlanPensiones
----------------
Date vencimiento;
float cotización;
String numCuentaOrigen;
4. 4
Tipos de Herencia
Principalmente existen dos tipos de herencia.
Herencia simple: una clase solo puede tener un
padre, por lo tanto la estructura de clases será en
forma de arbol.
Herencia múltiple: Una clase puede tener uno o
varios padres. La estructura de clases es un grafo
Tipos de Herencia
Herencia simple:
Muy fácil de entender y manejar tanto por el
lenguaje como por el programador.
Limitada puesto que en el mundo real un objeto
puede pertenecer a varias clases y sin embargo
aquí esta situación no se puede modelar
Tipos de Herencia
Herencia múltiple:
Es mas realista y da al programador más libertad
y mas posibilidades de reutilización de código.
Es mucho más difícil de utilizar por la posibilidad
de ciclos y para los lenguajes de programación es
muy costoso el permitirlo.
Tipos de Herencia
Ejemplo de herencia múltiple
ElAire
MedioComunicacion
Teléfono
ObjetoFísico
5. 5
Tipos de Herencia
Ejemplo herencia múltiple:
Constructor
----------------------------
Colegio colegio;
Arquitecto
--------------------
construir()
Aparejador
--------------------
construir()
ArquitectoYAparejador
----------------
Colegio colegio; ?????
construir()??????
Herencia en Java
Características
Como se utiliza
Redefinición de métodos, constructores,…
Como funciona la gestión de tipos en java
Métodos y clases abstractas
Interfaces
Ejemplos de herencia
Herencia en Java
Características
Herencia simple
Estructura jerárquica en árbol en donde en la raiz
podemos encontrar la clase Object, de las que
heredan todas las clases.
Todas las clases tienen un padre
Todos los objetos son “Object”
Java no permite que una subclase elimine un
método o una variable de instancia aunque esta no
la necesite
Herencia en Java
Como se utiliza:
6. 6
Herencia en Java Herencia en Java
Herencia en Java
Redefinición de métodos,constructores,
…
¿Qué pasa si en la superclase hay un método
que funciona distinto a como nos gustaría que
funcionara en la subclase?
¿Son las subclases responsables de inicializar
en sus constructores las variables heredadas
de las superclases?
¿Qué pasa si un método de la superclase no
debiera aparecer en la subclase?
7. 7
Redefinición de métodos
Redefinición de métodos
Redefinición de métodos
Redefinición de métodos Constructores
Las subclases NO son responsables de
inicializar las variables de instancia de las
variables que hereda
Para pasarle la responsabilidad de inicializar
esas variables a las superclases puede llamar
al constructor de estas mediante la sentencia
super()
Hay una especia de “herencia” de
constructores
8. 8
Constructores Eliminación de métodos
Java no lo permite
Solución: redefinir el método en las subclases
para que se genero un error en caso de que se
llame a un método no permitido
Tipos Métodos y clases abstractas
Un método se dice que es abstracto si lo
declaramos pero no lo implementamos.
Utilidad:
podemos llamar a métodos que aún no hemos
implementado o que se tienen que implementar
en la subclases.
Podemos declarar métodos que tendrán todas las
subclases pero que no se pueden implementar en
la superclase
Útil en polimorfismo
9. 9
Métodos y clases abstractas
¿Qué pasa si tenemos tres clases que
comparten un mismo mensaje pero que su
implementación es distinta en las tres?
Métodos y clases abstractas
Métodos y clases abstractas
Si creamos una superclase vehículo:
¿Qué hacemos con el método moverse?
¿Debe estar en la superclase? ¿es un método que
tendrán todas subclases de vehículo?
¿Qué implementación tendrá en la superclase?
¿Me aporta alguna ventaja?
Métodos y clases abstractas
10. 10
Métodos y clases abstractas
Moverse en la superclase será un método
abstracto:
Ventajas:
Las subclases tarde o temprano tienen que
implementarlo.
En la superclases en donde este definido puede ser
utilizado aunque no este implementado.
Métodos y clases abstractas
Una clase abstracta es una clase en la que al
menos tiene un método que es abstracto.
Este(os) método(s) abstracto(s) puede que lo haya
definido el o que los haya heredado.
Un clase abstracta NO puede instanciar objetos
¿Qué pasaría si se llamara a un método abstracto?
¿y si se llamara a un método no abstracto pero que
usa un método abstracto?
Para que una clase se declare como abstracta
tenemos que usar la palabra clave abstract
11. 11
Métodos y clases abstractas
IMPORTANTE: Para que un clase que hereda
de una superclase abstracta pueda instanciar
objetos debe de implementar todos los
métodos abstractos que ha heredado, porque
si no lo hiciera, también sería una clase
abstracta.
Interfaces
Definición informal:
Es una clase abstracta sin variables de instancia
en donde todos sus métodos son abstractos
Definición formal:
Es un contrato que establece una clase en el cual
esta clase asegura que implementará un conjunto
de métodos
Interfaces Interfaces
Para que una clase use un interfaz debe
implementar todos sus métodos e indicar que
está usando un interfaz.
12. 12
Interfaces
Utilidad de los interfaces: “simular” herencia
múltiple.
Nota: los interfaces solo tienen sentido en
lenguajes de programación que solo permiten
usar la herencia simple
Ejercicio
Diseñar un ecosistema donde podemos encontrar
varios tipos de animales (gatos, perros, leones,
ratones,…). Algunos de estos animales son
depredadores (comen para obtener “energía”) y
otros presas (son comidos y proporcionan
“energía”), y otros pueden actuar tanto como
depredadores como presas.
Diseñar este ecosistema empleando herencia múltiple
Diseñar este ecosistema empleando herencia sencilla
Ejercicio
Ecosistema con herencia múltiple
13. 13
Ejercicio
Ecosistema con herencia múltiple
Ventajas de esta representación:
Es la más cercana al modelo real
Reutilizamos código de las superclases
Desventajas:
Pocos lenguajes de programación admiten herencia
múltiple (C++)
Es más difícil de implementar (ciclos, variables
distintas de distintitas clases pero con el mismo
nombre,…)
Ejercicio
Ecosistema con herencia sencilla
Ejercicio
Ecosistema con herencia sencilla
Ventajas:
Si lo implementamos bien puede simular el mismo
modelo
Desventajas:
Las clases dejan de representar lo que deberían de
representar
Las subclases deben anular métodos porque si no se hace
podrían hacer cosas raras (un ratón podría comerse un
perro) -> ¿Qué pasa si tengo herencia múltiple con
muchas clases? problemas con los olvidos
Ejercicio
Ecosistema con herencia sencilla y interfaces
14. 14
Ejercicio
Ecosistema con herencia sencilla y interfaces
Ventajas:
El modelo refleja bastante fielmente la situación real
Las clases implementadas son conceptualmente
correctas
Desventajas:
Se deben implementar los interfaces. No hay
reutilización de código.
Ejercicio
Ecosistema con herencia sencilla y interfaces
(segundo enfoque):
Ecosistema con herencia sencilla y interfaces
(segundo enfoque):
Ventajas
El modelo refleja bastante fielmente la situación real
No hay que implementar los interfaces
Desventajas
Las clases implementadas no son del todo
conceptualmente correctas pero evitamos un mal uso