1.089 visualizaciones desde el 7 de Julio del 2017
636,7 KB
50 paginas
Creado hace 18a (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);
Comentarios de: TEMA 3 Herencia: Conceptos básicos (0)
No hay comentarios