Publicado el 24 de Enero del 2017
2.474 visualizaciones desde el 24 de Enero del 2017
484,6 KB
132 paginas
Creado hace 16a (15/10/2008)
Tema 3: Herencia en Java
Programación Orientada a Objetos
Curso 2008/2009
Begoña Moros Valle
Índice
Introducción
Herencia y Ocultamiento de la Información
Redefinición de características
Herencia y creación
Polimorfismo
Herencia y Sistema de tipos
Ligadura dinámica
Clase Object
Genericidad y Herencia
Genericidad restringida
Clases comportamiento: Iteradores
Clases abstractas
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
Refinar: extender el uso original
Reemplazar: mejorar la implementación
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
Polígonos y Rectángulos
Tenemos la clase Poligono y necesitamos
representar rectángulos:
¿Debemos crear la clase
Rectangulo partiendo de cero?
Podemos aprovechar la existencia de similitudes
y particularidades entre ambas clases
Tema 3
Herencia
10
Polígonos y Rectángulos
Un rectángulo tiene muchas de las características de un
polígono (rotar, trasladar, vértices,..)
Pero
tiene características especiales
(diagonal) y
propiedades especiales (4 lados, ángulos rectos)
Algunas
polígono
implementarse más eficientemente (perímetro)
características
de
pueden
class Rectangulo extends Poligono{
...Características específicas
}
Tema 3
Herencia
11
public class Poligono {
//Un polígono se implementa como una lista de
//puntos sucesivos
private List<Punto> vertices;
private int numVertices;
public Poligono(List<Punto> puntos) {
vertices = new LinkedList<Punto>(puntos);
numVertices = puntos.size();
return numVertices;
}
public int getNumVertices(){
}
public void rotar (Punto centro,
public void trasladar (double a, double b){…}
public void visualizar(){…}
public double perimetro(){…}
…
double angulo){…}
3
/
1
o
n
o
g
í
l
o
P
e
s
a
C
l
}
Tema 3
Herencia
12
/**
* Desplaza a horizontalmente y b verticalmente
*/
public void trasladar (double a, double b){
for (Punto pto : vertices)
pto.trasladar(a,b);
}
3
/
2
o
n
o
g
í
l
o
P
e
s
a
}C
l
/**
* Rota el ángulo alrededor del centro
*/
public void rotar (Punto centro, double angulo){
for (Punto pto : vertices)
pto.rotar(centro, angulo);
Tema 3
Herencia
13
/**
* Suma las longitudes de los lados
*/
public double perimetro(){
3
/
3
o
n
o
g
í
l
o
P
e
s
a
l
}C
double total = 0;
Punto anterior;
Punto actual = vertices.get(0);
for (int index = 1; index < numVertices; index++){
anterior = actual;
actual = vertices.get(index);
total = total + actual.distancia(anterior);
}
total=total+actual.distancia(vertices.get(0));
return total;
Tema 3
Herencia
14
public class Rectangulo extends Poligono{
Clase Rectangulo
private double lado1, lado2; //Nuevos atributos
private double diagonal;
public Rectangulo(List<Punto> vertices,
double lado1, double lado2){
super(vertices);
this.lado1 = lado1;
this.lado2 = lado2;
}
@Override //Redefine perímetro
public double perimetro(){
}
public double diagonal() {//Nuevos métodos
}
return (2*(lado1 + lado2 ));
return Math.sqrt(lado1*lado1 + lado2*lado2);
}
Tema 3
Herencia
15
Clase Rectángulo
Rectángulo hereda todos los métodos definidos
en Polígono, no hay que repetirlos:
Rectangulo.trasladar(0.0,0.0);
Añade nuevas características:
Atributos: lado1, lado2
Constructor que invoca al constructor de Poligono
Métodos: diagonal
Redefine características heredadas:
Reemplaza la implementación de perímetro
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
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
18
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
19
Redefinición
La redefinición reconcilia la reutilización con la
extensibilidad:
“Es raro reutilizar un componente software sin necesidad de
cambios”
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étodo de la subclase con la misma signatura
(nombre y parámetros) que un método de la superclase
lo está redefiniendo.
Si se cambia el tipo de los parámetros se está sobrecargando el
método original
Tema 3
Herencia
20
Redefinición de métodos
Una clase hija puede redefinir un método de la
clase padre por dos motivos:
Reemplazo:
Mejorar implementación.
Ej: redefinir perímetro en la clase Rectangulo.
Otra diferente (aunque con la misma semántica).
Ej: el método dibujar en la jerarquía de Figura
Refinamiento:
Método del padre + acciones específicas
Ej: ingreso en una CuentaAhorro calcula un beneficio
Tema 3
Herencia
21
Refinamiento: super
Si un método redefinido refina el
comportamiento del método original puede
necesitar hacer referencia a este
comportamiento
super se utiliza para invocar a un método de
la clase padre:
super.met();
Se “rompe” la l
Comentarios de: Tema 3: Herencia en Java (0)
No hay comentarios