Publicado el 31 de Mayo del 2018
1.227 visualizaciones desde el 31 de Mayo del 2018
674,2 KB
58 paginas
Creado hace 18a (27/11/2006)
Programación Orientada a Objetos
TEMA 4
Herencia:
Conceptos básicos
Facultad de Informática
Universidad de Murcia
Programación Orientada a Objetos
TEMA1: CALIDAD DEL SOFTWARE
Modularidad
• Extensibilidad
• Reutilización
• Variación de tipos
• Agrupar características
• Variación de algoritmos y est. de datos
• Independencia de la representación
• Factorizar comportamiento común
Ocultamiento de Información
Principio Abierto-Cerrado
Principio de Elección Única
…
• Fiabilidad
• Corrección
• Robustez
...
TEMA5 Herencia múltiple
Tema4: Herencia
TEMA 2 Clases y Objetos
Genericidad
Clase: estructura (ref)
comportamiento (mens)
Niveles de acceso a propiedades
TEMA 3 Corrección y
robustez
Asertos. Diseño por Contrato
Excepciones
TEMA4 Herencia
• Polimorfismo
• Ligadura dinámica
• Clases diferidas
• Código genérico
2
•1
Índice
1.- Introducción
2.- Polimorfismo
3.- Herencia y Sistema de tipos
4.- Genericidad y Herencia
- Estructuras de datos polimórficas
* Intento de asignación
- Genericidad restringida
5.- Ligadura dinámica
6.- Clases Abstractas y Diferidas
- Clases comportamiento: Iteradores
7.- Redefinición de características: refinamiento vs. reemplazo
8.- Herencia y Creación
9.- Herencia y Ocultamiento de Información
10.- Herencia y Aserciones
11.- Herencia y Excepciones
3
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.
Tema4: Herencia
4
•2
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
Tema4: Herencia
5
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
Tema4: Herencia
6
•3
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
Eiffel:
Java:
C++:
C#:
clase ANY
clase Object
no existe
clase System.Object
Tema4: Herencia
7
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 renombrar atributos o métodos
-B puede implementar un método diferido en A
…
Adaptaciones dependientes del lenguaje
(Redefinición disponible en cualquier LPOO)
Tema4: Herencia
8
•4
El proceso de la herencia es transitivo
A
B
C
B hereda de A
C hereda de B y A
B y C son descendientes (subclases) de A
B es un descendiente directo de A
C es un descendiente indirecto de A
TERMINOLOGÍA
B hereda de A
B es descendiente de A (Eiffel)
A es un ascendiente de B (Eiffel)
B es subclase de A (Java)
A es superclase de B (Java)
B es una clase derivada de A (C++)
A es la clase base de B (C++)
9
Tema4: Herencia
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++
Tema4: Herencia
10
•5
¿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
Tema4: Herencia
11
Ejemplo: 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
Tema4: Herencia
12
•6
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)
Poligono
class Rectangulo inherit
feature
end
...Características específicas
Tema4: Herencia
13
3
/
1
o
n
o
g
í
l
o
P
e
s
a
C
l
class POLIGONO creation ...
feature {NONE}
vertices: LINKED_LIST [PUNTO];
-- implementación
-- ptos sucesivos formando el polígono
feature
-- acceso
numero_vertices: INTEGER;
rotar (centro:PUNTO; angulo:REAL) is do .. end;
trasladar (a, b: REAL) is do .. end;
visualizar is do .. end;
perimetro : REAL is do .. end;
…
invariant
numero_vertices = vertices.count
numero_vertices >=3
end -- class POLIGONO
Tema4: Herencia
14
•7
3
/
2
o
n
o
g
í
l
o
P
e
s
a
C
l
3
/
3
o
n
o
g
í
l
o
P
e
s
a
C
l
trasladar (a, b: REAL) is do
-- desplaza a horizontalte y b verticalte
from vertices.start
until vertices.after
loop
vertices.item.trasladar(a,b)
vertices.forth
end
end;
rotar (centro, angulo: REAL) is do
-- rotar el angulo alrededor del centro
from vertices.start
until vertices.after
loop
vertices.item.rotar(centro,angulo)
vertices.forth
Tema4: Herencia
15
end
end;
perimetro : REAL is
-- suma de las longitudes de los lados
actual, anterior : PUNTO
local
do
vertices.is_last ;
actual
actual:= vertices.item ;
from vertices.start;
until
loop
anterior := actual ;
vertices.forth ;
actual := vertices.item ;
Result:= Result + actual.distancia(anterior);
end;
anterior
Result:=Result+actual.distancia(vertices.first);
is_last
start
end;
Tema4: Herencia
16
•8
o
l
u
g
n
á
t
c
e
R
e
s
a
C
l
redefine perimetro
class RECTANGULO inherit POLIGONO
creation crear
feature
lado1, lado2 : REAL ;
diagonal : REAL ;
Atributos nuevos
…
perimetro : REAL is do
Result := 2 * ( lado1 + lado2 )
end ;
end ;
Todas las características de Poligono están
disponibles
clase
Rectangulo, no es necesario que se repitan.
automáticamente para
la
Tema4: Herencia
17
Doble aspecto 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
Tema4: Herencia
18
•9
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.
Tema4: Herencia
19
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
Tema4: Herencia
20
•10
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
Tema4: Herencia
21
¿Un mecanismo o más?
• ”Esta división parece causar más daños que beneficios” [Meyer 24.6]:
– Sólo dos categorías no es representativo
– Discusiones metodológicas inútiles
– Complejidad del lenguaje
• Casi todos los mecanismos auxiliares (redefinición, renombramiento) son
útiles en ambas visiones
• En Eiffel y C# existe un único mecanismo
• C++ distingue entre herencia de tipos (public) y de
implementación (private)
• Java también distingue entre herencia de tipos e implementación
utilizando interfaces para los tipos y clases para implementación
22
Tema4: Herencia
•11
2.- Polimorfismo
• El término polimorfismo significa que hay un
nombre (variable, función o clase) y muchos
significados diferentes (distintas definiciones).
• Formas de polimorfismo [Budd’02]:
– Polimorfismo de asi
Comentarios de: TEMA 4 Herencia: Conceptos básicos - Programación Orientada a Objetos (0)
No hay comentarios