Publicado el 14 de Enero del 2017
1.266 visualizaciones desde el 14 de Enero del 2017
395,3 KB
134 paginas
Creado hace 15a (12/10/2009)
Tema 3: Herencia en Java
Programación Orientada a Objetos
Curso 2009/2010
Begoña Moros Valle
Índice
Introducción
Herencia y creación
Herencia y Ocultamiento de la Información
Redefinición de características
Polimorfismo
Herencia y Sistema de tipos
Ligadura dinámica
Clase Object
Genericidad y Herencia. Genericidad restringida
Clases abstractas
Interfaces
Colecciones en Java (paquete java.util)
Patrones de diseño:
Método plantilla, Patrón Estrategia y Patrón Composite
Herencia Múltiple
Tema 3
Herencia
2
Introducción
Las clases no son suficientes para conseguir los objetivos
de:
(A) REUTILIZACIÓN: Necesidad de mecanismos para
generar código genérico:
Capturar aspectos comunes en grupos de estructuras similares
Independencia de la representación
Variación en estructuras de datos y algoritmos
(B) EXTENSIBILIDAD: Necesidad de mecanismos para
favorecer:
“Principio abierto-cerrado” y “Principio Elección Única”
Estructuras de datos polimórficas.
Tema 3
Herencia
3
Introducción
Entre algunas clases pueden existir relaciones
conceptuales:
Extensión, Especialización, Combinación
EJEMPLO:
Libros y Revistas tienen propiedades comunes
Una Pila puede definirse a partir de una Cola o viceversa
Un Rectángulo es una especialización de Polígono
Puede haber distintos tipos de Cuentas
¿Tiene sentido crear una clase a partir de otra?
La herencia es el mecanismo que:
sirve de soporte para registrar y utilizar las relaciones
conceptuales existentes entre las clases
posibilita la definición de una clase a partir de otra
Tema 3
Herencia
4
Jerarquías de herencia
La herencia organiza las clases en una estructura
jerárquica formando jerarquías de clases
Ejemplos:
PUBLICACION
FIGURA
LIBRO
REVISTA
POLIGONO
CIRCULO
LIBRO_TEXTO
INVESTIGACION MAGAZINE
RECTANGULO
No es tan sólo un mecanismo para compartir código
Consistente con el sistema de tipos del lenguaje
Tema 3
Herencia
5
Introducción
Si una clase B hereda de otra clase A
entonces:
B incorpora la estructura (atributos) y
comportamiento (métodos) de la clase A
B puede incluir adaptaciones:
B puede añadir nuevos atributos
B puede añadir nuevos métodos
B puede redefinir métodos
Las adaptaciones son dependientes del
lenguaje
Tema 3
Herencia
6
El proceso de herencia es transitivo
A
B
C
B hereda de A
A es la superclase y B la subclase
C hereda de B y A
B y C son subclases de A
B es un descendiente directo de A
C es un descendiente indirecto de A
Tema 3
Herencia
7
Tipos de herencia
D
B
B
E
A
C
Herencia simple
Una clase puede heredar de una única
clase.
Ejemplo: Java, C#
A
C
Herencia múltiple
Una clase puede heredar de varias
clases.
Clases forman un grafo dirigido acíclico
Ejemplos: Eiffel, C++
Tema 3
Herencia
8
Diseño de jerarquías de herencia
Generalización (Factorización)
Se detectan clases con un comportamiento común
Ejemplo: Libro y Revista son Publicaciones
Especialización (Abstracción)
Se detecta que una clase es un caso especial de otra
Ejemplo: Rectangulo es un tipo de Poligono
No hay receta mágica para crear buenas
jerarquías
Problemas con la evolución de la jerarquía
Tema 3
Herencia
9
Caso de estudio: Gestión bancaria
Además de abrir cuentas en el banco se pueden
contratar depósitos.
Un depósito permite a los clientes obtener una
rentabilidad por su dinero
Un depósito se caracteriza por:
Estructura: titular, capital, plazo en días, tipo de
interés
Comportamiento:
liquidarel depósito una vez cumplido el plazo con lo que se
devuelve al cliente el capital invertido más los intereses
Consultar los interesesproducidos al final del periodo.
Tema 3
Herencia
10
Clase Depósito (1/2)
public class Deposito {
private Persona titular;
private double capital;
private int plazoDias;
private double tipoInteres;
public Deposito(Persona titular, double capital,
int plazoDias, double tipoInteres) {
this.titular = titular;
this.capital = capital;
this.plazoDias = plazoDias;
this.tipoInteres = tipoInteres;
} …
Tema 3
Herencia
11
Clase Depósito (2/2)
return (plazoDias * tipoInteres * capital)/365;
return getCapital() + getIntereses();
public double liquidar() {
}
public double getIntereses() {
}
public double getCapital() {…}
public int getPlazoDias() {…}
public double getTipoInteres() {…}
public Persona getTitular() {…}
}
Tema 3
Herencia
12
Caso de estudio: Gestión bancaria
Existe un tipo de depósito que se denomina depósito
estructurado
Un depósito estructurado es un tipo de depósito que se
caracteriza por tener una parte del capital invertido a
interés fijo y otra parte a interés variable
Comparte las características de depósito
Añade características nuevas
¿Debemos crear la clase depósito estructurado
desde cero?
¿Podemos aprovechar la existencia de similitudes y
particularidades entre ambas clases?
DepositoEstructurado hereda de Deposito
Tema 3
Herencia
13
Deposito y DepositoEstructurado
Tema 3
Herencia
14
Clase DepositoEstructurado
public class DepositoEstructurado extends Deposito {
private double tipoInteresVariable;
private double capitalVariable;
public DepositoEstructurado( … ) { … }
public double getInteresesVariable() {
return (getPlazoDias() * tipoInteresVariable
* capitalVariable)/365;
}
public double getTipoInteresVariable() { … }
public void setTipoInteresVariable(
public double getCapitalVariable() { … }
double tipoInteresVariable){ … }
}
Tema 3
Herencia
15
Clase DepositoEstructurado
Depósito estructurado hereda todas las
características de depósito:
Hereda todos los atributos aunque no los vea
porque se han definido como privados (Principio
Ocultamiento de la Información)
Puede utilizar todos los métodos heredados como si
fueran propios (por ejemplo, getPlazoDias)
Añade nuevas características:
Atributos: capitalVariable, tipoInteresVariable
Métodos: getCapitalVariable, setCapitalVariable,
getTiopInteresVariable.
Tema 3
Herencia
16
Herencia y creación
El constructor de la clase hija refina el comportamiento
del padre
En Java los constructores no se heredan
La primera sentencia del constructor de la clase hija
SIEMPRE es una llamada al constructor de la clase
padre.
La llamada al constructor del padre puede ser:
Implícita:
Explícita:
Si se omite, se llamará implícitamente al constructor por defecto
Equivale a poner como primera sentencia super();
Si no existe el constructor por defecto en la clase padre dará un
error en tiempo de compilación
super(); o super(a,b); o …
Dependiendo de si el constructor al que invocamos tiene o no
argumentos
Tema 3
Herencia
17
Clase DepositoEstructurado
public class DepositoEstructurado extends Deposito {
private double tipoInteresVariable;
private double capitalVariable;
public DepositoEstructurado(Persona titular, double capital,
int plazoDias, double tipoInteres, double tipoInteresVariable,
double capitalVariable) {
//Llamada explícita al constructor del padre
super(titular, capital, plazoDias, tipoInteres);
this.tipoInteresVariable = tipoInteresVariable;
this.capitalVariable = capitalVariable;
}
…
}
Tema 3
Herencia
18
Acceso protegido
Una subclase hereda todos los atributos definidos en la
superclase, pero no puede acceder a los campos
privados.
Para permitir que en un método de la subclase se
pueda acceder a una característica (atributo/método)
de la superclase, éste tiene que declararse como
protected
Es discutible la visibilidad protegida para los atributos
Es útil la visibilidad protegida para los métodos
Protected: características visibles a las subclases y
al resto de clases del paquete
Tema 3
Herencia
19
Resumen modificadores de acceso
De más restrictivo a menos:
private
visible sólo en la clase donde se define
Sin modificador (por defecto)
visible a las clases del paquete
protected
visible a las subclases y al resto de clases del paquete
public
visible a todas las clases
Tema 3
Herencia
20
Redefinición
¿Son válidos todos los métodos heredados de la
clase depósito para un depósito estructurado?
getCapital: debe devolver la suma del capital fijo más el
capital variable en el caso del depósito estructurado
getIntereses: debe devolver la suma del interés fijo y el
variable para un depósito estructurado
Al heredar es posible redefinir los métodos para
adaptarlos a la semántica de la nueva clase.
La redefinición reconcilia la reutilización con la
extensibilidad
Es raro reutilizar una clase sin necesidad de hacer cambios
Tema 3
Herencia
21
Redefinición
Los atributos no se pueden redefinir, sólo se
ocultan
Si la clase hija define un atributo con el mismo
nombre que un atributo de la clase padre, éste no
está accesible
El campo de la superclase todavía existe pero no se
puede acceder
Un m
Comentarios de: Tema 3: Herencia ej Java (0)
No hay comentarios