Publicado el 7 de Julio del 2017
962 visualizaciones desde el 7 de Julio del 2017
636,7 KB
50 paginas
Creado hace 17a (15/10/2007)
Programación Orientada a Objetos
TEMA 3
Herencia:
Conceptos básicos
Facultad de Informática
Universidad de Murcia
Índice
1.- Introducción
2.- Poligono y Rectangulo
- Herencia y Ocultamiento de Información
- Redefinición de características: refinamiento vs. reemplazo
- Herencia y creación
3.- Polimorfismo
4.- Herencia y Sistema de tipos
5.- Genericidad
- Estructuras de datos polimórficas
- Genericidad restringida
6.- Ligadura dinámica
7.- Clases abstractas
- Clases comportamiento: Iteradores
Tema3: Herencia
2
•1
1.-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.
Tema3: 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”
“Una ventana de texto es un rectángulo dónde se manipula texto”
¿Tiene sentido crear una clase a partir de otra?
soporte para registrar y utilizar estas relaciones
posibilita la definición de una clase a partir de otra
Herencia
Tema3: Herencia
4
•2
Introducción. Jerarquías de clases
La herencia organiza las clases en una estructura jerárquica:
Jerarquías de clases
Ejemplos:
PUBLICACION
FIGURA
LIBRO
REVISTA
POLIGONO
CIRCULO
INVESTIGACION MAGAZINE
LIBRO_TEXTO
• No es tan solo un mecanismo para compartir código.
• Consistente con el sistema de tipos del lenguaje
RECTANGULO
Tema3: Herencia
5
Introducción
• Puede existir una clase “raíz” en la jerarquía de la
cual heredan las demás directa o indirectamente.
• Incluye todas las características comunes a todas las
clases
• En Java esta clase es la clase Object
– equals
– clone
– toString
Tema3: Herencia
6
•3
Introducción
Si B hereda de A entonces B incorpora la estructura (atributos) y
comportamiento (métodos) de la clase A, pero 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
-B puede implementar un método abstracto en A
…
Adaptaciones dependientes del lenguaje
Tema3: Herencia
El proceso de la 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
Tema3: Herencia
7
8
•4
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++
Tema3: Herencia
9
¿Cómo detectar la herencia durante el diseño?
• Generalización (Factorización)
Se detectan clases con un comportamiento común
(p.e. Libro y Revista )
• Especialización (Abstracción)
Se detecta que una clase es un caso especial de otra
(p.e. Rectangulo de Poligono)
No hay receta mágica para crear buenas jerarquías
Problemas con la evolución de la jerarquía
Tema3: Herencia
10
•5
Significado de la herencia
Clases
Modulo Mecanismo de extensión
Tipo
Herencia
Mecanismo de especialización Clasificación de tipos
Reutilizar características
¿relación
es-un?
A
B
{ Prop(A) }
{ Prop(B) }
Sean:
Prop(X) : Propiedades (atributos y métodos) de la clase X
dom(C) : Conjunto de instancias de una clase C
• B extiende la clase A => Prop (A) ⊂ Prop (B)
• Cualquier objeto de B puede ser considerado
objeto de A
•Siempre que se espera un objeto de A podemos
recibir un objeto de B, puesto que aceptaría todos
sus mensajes
• dom (B) ⊂ dom (A) =>B es un subtipo de A
Tema3: Herencia
11
El significado de los subtipos
• El principio de sustitución de Liskov [B. Liskov 88]:
“Lo que se quiere aquí es algo como la siguiente
propiedad de sustitución: si para cada objeto o1 de
tipo S hay un objeto o2 de tipo T tal que para todos los
programas P definidos en
términos de T, el
comportamiento de P no varía cuando se sustituye o1
por o2 entonces S en un subtipo de T”
• Funciones que utilizan referencias a superclases deben
ser capaces de utilizar objetos de subclases sin saberlo.
Tema3: Herencia
12
•6
Herencia de Implementación vs. Herencia de Tipos
• No siempre se corresponden las clases con tipos
• Dos consideraciones:
– ¿Cómo relacionamos los tipos?
• HERENCIA DE TIPOS o DE COMPORTAMIENTO
• Da lugar a jerarquías basadas en aspectos comunes
– ¿Cómo organizamos las clases para reutilizar código?
• HERENCIA DE IMPLEMENTACIÓN o CÓDIGO
• Clases no relacionadas pero que tienen código similar
• Las clases podrían parecer repositorios de código
Tema3: Herencia
13
Ejemplos. Herencia de Tipos e Implementación
1) Coincide herencia de tipos e implementación
REAL
WEIGHT
HEIGHT
Weight y Height son tipos
de medidas que tienen
propiedades en común con
los números reales
2) Herencia de implementación:
todas las propiedades del padre
pueden no aplicarse al hijo
3) Herencia de comportamiento
(especializar un tipo)
ARRAY
PILA
ELIPSE
CIRCULO
Tema3: Herencia
14
•7
2.- 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
Tema3: Herencia
15
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 características de polígono pueden implementarse más
eficientemente (perímetro)
class Rectangulo extends Poligono{
...Características específicas
}
Tema3: Herencia
16
•8
public class Poligono {
vertices = new LinkedList();
//Un polígono se implementa como una lista de //puntos
sucesivos
private List<Punto> vertices;
private int numVertices;
public Poligono(…) {
… }
public int getNumVertices(){
}
public void rotar (Punto centro,
public void trasladar (double a, double b){…}
public void visualizar(){…}
public double perimetro(){…}
…
return numVertices;
double angulo){…}
3
/
1
o
n
o
g
í
l
o
P
e
s
a
C
l
}
Tema3: Herencia
17
/**
* Desplaza a horizontalmente y b verticalmente
*/
public void trasladar (double a, double b){
for (Punto pto : vertices)
pto.trasladar(a,b);
/**
* Rota el ángulo alrededor del centro
*/
public void rotar (Punto centro, double angulo){
for (Punto pto : vertices)
pto.rotar(centro, angulo);
3
/
2
o
n
o
g
í
l
o
P
e
s
a
C
l
}
}
Tema3: Herencia
18
•9
/**
* Suma las longitudes de los lados
*/
public double perimetro(){
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;
3
/
3
o
n
o
g
í
l
o
P
e
s
a
C
l
}
Tema3: Herencia
19
Clase Rectángulo
public class Rectangulo extends Poligono{
private double lado1, lado2; //Nuevos atributos
private double diagonal;
public Rectangulo(double lado1, double lado2){
super(…);
this.lado1 = lado1;
this.lado2 = lado2;
}
@Override //Redefine perímetro
public double perimetro(){
}
return (2*(lado1 + lado2 ));
}
las características de Poligono están disponibles
Todas
automáticamente para la clase Rectangulo, no es necesario que
se repitan.
Tema3: Herencia
20
•10
Acceso protegido
• Una subclase no puede acceder a los campos privados de
la superclase
• Para permitir que un método de la subclase pueda
acceder a un campo de la superclase, éste tiene que
declararse como protected
• protected: miembros visibles a las subclases y al
resto de clases del paquete
• Resumen de modificadores de acceso:
– private
– public
– protected
– Sin modificador –visible en el paquete
–visible sólo en la clase
–visible a todas las clases
–visible a las subclases y en el paquete
21
Herencia en Java
• Toda clase hereda directa o indirectamente de la clase
Object
• Una subclase hereda de su superclase métodos y
variables tanto de clase como de instancia.
• Una subclase puede añadir nuevos métodos y
variables.
• Una subclase puede redefinir métodos heredados.
Tema3: Herencia
22
•11
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
– el campo de la superclase todavía existe pero no se puede acceder
• Un método de la subclase con la misma signatura y valor de
está
retorno que un método de
REDEFINIENDO.
– Si se cambia el tipo de los parámetros se está sobrecargando el
lo
la
superclase
método original
Tema3: Herencia
23
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.
Tema3: Herencia
24
•12
Refinamiento: super
• Si un método redefinido refina el comportamiento del
método original puede necesitar hacer referencia a es
Comentarios de: TEMA 3 Herencia: Conceptos básicos (0)
No hay comentarios