Publicado el 7 de Julio del 2017
1.266 visualizaciones desde el 7 de Julio del 2017
572,2 KB
79 paginas
Creado hace 17a (07/01/2008)
Programación Orientada a Objetos
TEMA 5
Herencia Múltiple
Facultad de Informática
Universidad de Murcia
Índice
1.- Introducción
2.- Utilidades de la herencia múltiple
3.- Problemas con la herencia múltiple:
a) Colisión de nombres
b) Herencia repetida
• Conflicto cuando hay compartición
• Conflicto cuando hay duplicación
4.- Herencia múltiple en Java: Interfaces
2
1.- Introducción
• Las clases pueden necesitar mas de una clase padre
• Más difícil de usar e implementar que la herencia
simple.
• Algunos consideran que produce más inconvenientes
que ventajas. Según B. Meyer:
– “No puedo pensar en una aplicación seria escrita en Eiffel
que no use la herencia múltiple en un modo significativo”
– “Para discutir cuestiones conceptuales sobre H.M. es
necesario considerar el doble aspecto de la herencia:
subtipos y extensión modular”
3
Herencia múltiple y Extensión modular
MATH
R
STORABLE
R
S
S
• S es una especialización de R
• MATH incluye un paquete de rutinas matemáticas
• STORABLE ofrece servicios de persistencia de
objetos
4
Herencia Múltiple y Subtipos
Ejemplo1: Implementación de los menús de una aplicación (1/2)
i) Los menús son simples
Menu
numItems
display
opciones
*
menu
MenuItem
ejecutar
ii) Los menús contienen submenús (Menú compuesto)
1) Cambiar el tipo de la colección
MENU TREE [OPCION_MENU]
“provocaría muchos cambios”
2) Aprovechar la implementación de i) con herencia múltiple
5
Herencia Múltiple y Subtipos
Ejemplo1: Implementación de los menús de una aplicación (2/2)
ii) Los menús contienen submenús (Menú compuesto)
Menu
numItems
display
opciones
*
menu
MenuItem
ejecutar
Submenu
ejecutar
ejecutar is do
end
display
6
Ejemplo2: Profesores ayudantes están matriculados de
los cursos de doctorado
PERSONAL_UNI
PROFESOR
ESTUDIANTE
PROFESOR_AYUDANTE
Ejemplo3: Añadir un nuevo tipo de cuenta que comparte a
la vez propiedades de cuenta de ahorro y
cuenta corriente
CUENTA_BANCARIA
CUENTA_AHORRO CUENTA_CORRIENTE
7
SOLUCIÓN:
Con herencia múltiple
Sin herencia múltiple
CUENTA_
BANCARIA
CUENTA_
BANCARIA
CUENTA_
AHORRO
CUENTA_
CORRIENTE
CUENTA_
AHORRO
CUENTA_
CORRIENTE
NUEVA_CUENTA
8
SOLUCIÓN:
Con herencia múltiple
Sin herencia múltiple
CUENTA_
BANCARIA
CUENTA_
BANCARIA
CUENTA_
AHORRO
CUENTA_
CORRIENTE
CUENTA_
AHORRO
CUENTA_
CORRIENTE
NUEVA_CUENTA
NUEVA_CUENTA
Debemos añadir a NUEVA_CUENTA
las propiedades de
CUENTA_CORRIENTE
9
SOLUCIÓN:
Con herencia múltiple
Sin herencia múltiple
CUENTA_
BANCARIA
CUENTA_
BANCARIA
CUENTA_
AHORRO
CUENTA_
CORRIENTE
CUENTA_
AHORRO
CUENTA_
CORRIENTE
NUEVA_CUENTA
NUEVA_CUENTA
Debemos añadir a NUEVA_CUENTA
las propiedades de
CUENTA_AHORRO
10
SOLUCIÓN:
Con herencia múltiple
Sin herencia múltiple
CUENTA_
BANCARIA
CUENTA_
BANCARIA
CUENTA_
AHORRO
CUENTA_
CORRIENTE
CUENTA_
AHORRO
CUENTA_
CORRIENTE
NUEVA_CUENTA
NUEVA_CUENTA
Perdemos:
• Polimorfismo
• Principio de Abierto-Cerrado
• Beneficios de la reutilización de la herencia
11
Ejemplo4: ”Añadir a la jerarquía Smalltalk una clase para
representar números complejos”
MAGNITUDE
{=, <, >, ..}
{+, -, *, / ..}
NUMBER
CHAR
INTEGER
Soluciones:
OPCION A
Magnitude
OPCION B
Magnitude
Number
Char
Number
Char
Integer
Complejo
Integer
Complejo
{=, >, <, ERROR}
12
2.- Utilidades de la herencia múltiple
A) Combinar abstracciones de tipos (padres simétricos)
B) Matrimonio de conveniencia
- Herencia de implementación
C) Herencia de estructura
D) Herencia de facilidades
13
A) Combinación de interfaces no relacionadas
Ejemplo1:
class Ventana inherit
TREE [Ventana]
Rectangulo
feature
....
end
class VentanaTexto inherit
WINDOW
STRING
feature
....
end
“Una ventana es un objeto
gráfico y un árbol de
ventanas”
“Una ventana de texto es
una ventana que manipula
texto”
14
A) Combinación de interfaces no relacionadas
Ejemplo2:
class TREE [G] inherit
LIST [G]
LINKABLE [G]
feature
....
end
LIST permite obtener los hijos de un
nodo, añadir/eliminar un hijo,...
LINKABLE permite obtener el valor
de un nodo, su hermanos, su padre,
añadir un hermano...
“Un árbol es una lista, la lista
de sus hijos, pero también es
un elemento potencial de la
lista (un subárbol de otro
árbol)
“Un árbol es una lista que
es también un elemento de
la lista”
15
TREE[G] gráficamente
A
B
C
D
E
A
•
2
E
•
•
0
B
2
D
•
0
ARBOL es_un NODO
valor
siguiente
cabeza
numElementos
ARBOL es_una LISTA
C
•
•
0
16
C) Herencia de Estructura:
Se desea que una clase posea ciertas propiedades además de
la abstracción que representa.
NUMERIC
COMPARABLE
DIAGRAMA
STORABLE
INTEGER
DIAGRAMA_CLASES
D) Herencia de Facilidades:
Existen clases que existen con el único propósito de ofrecer
unos servicios a sus descendientes
MATH
A
ASCII
A
ITERATOR
A
B
B
B
17
B) Matrimonio por conveniencia
Proporcionar una implementación para una abstracción definida
por una clase diferida usando las facilidades que proporciona
una clase efectiva
ARRAY [T]
PILA [T]*
LINKED_LIST [T]
export{NONE} all
export{NONE} all
PILA_FIJA [T]+
PILA_ENLAZADA [T]+
• La clase PILA_FIJA[T] sólo exporta las características exportadas por PILA[T]
y oculta las propiedades de ARRAY[T].
• La clase PILA_ENLAZADA[T] sólo exporta las características exportadas por
PILA [T] y oculta las propiedades de LINKED_LIST[T].
18
B) Matrimonio por conveniencia
Proporcionar una implementación para una abstracción definida
por una clase diferida usando las facilidades que proporciona
una clase efectiva
ARRAY [T]
PILA [T]*
LINKED_LIST [T]
export {NONE} all
export {NONE} all
PILA_FIJA [T]+
PILA_ENLAZADA [T]+
HERENCIA DE IMPLEMENTACIÓN
• La clase PILA_FIJA [G] sólo exporta las características exportadas por PILA [G]
y oculta las propiedades de ARRAY [G].
• La clase PILA_ENLAZADA [G] sólo exporta las características exportadas por
PILA [G] y oculta las propiedades de LINKED_LIST [G].
19
s
y
a
r
r
a
o
d
n
a
s
u
s
a
2
/
1
l
i
P
e
d
n
ó
i
c
a
t
n
e
m
e
l
p
m
I
class PILA_FIJA [T] inherit
PILA [T]
ARRAY [T] export {NONE} all
rename put as array_put,
make as array_make,
count as capacity
end
creation make
feature
--hace efectiva como atributo una
--característica diferida
make (n: INTEGER) is
count: INTEGER;
tamaño_no_negativo: n>=0;
require
do
array_make (1,n)
ensure
capacidad: capacity = n;
vacia: count = 0
end
20
s
y
a
r
r
a
o
d
n
a
s
u
s
a
2
/
2
l
i
P
e
d
n
ó
i
c
a
t
n
e
m
e
l
p
m
I
--¿Está llena la representación de la
Result:= (count = capacity)
full: BOOLEAN is do
pila?
end;
put (x: T) is
21
-- Pone x en la cima de la pila
require
not full
do
count:= count + 1;
array_put (x, count)
end;
invariant
count>=0 ;
count <= capacity
...
end -- PILA_FIJA [T]
Ejemplo: Figuras Compuestas
Vamos a ver un patrón de diseño general (de utilidad en
muchas áreas) que describe estructuras compuestas a través
de la herencia múltiple, usando una clase contenedora (lista)
como una de sus clases padre, PATRÓN COMPOSITE.
class FIGURA_COMPUESTA inherit
FIGURA
LINKED_LIST [FIGURA]
feature
…
end
“Una figura compuesta es una figura”
“Una figura compuesta es una lista de figuras”
22
Figura Compuesta con herencia múltiple
FIGURA*
visualizar
girar
…
LISTA[FIGURA]
start
after
forth
FIGURA_COMPUESTA
visualizar
girar
…
visualizar is do
from start
until after
loop
item.visualizar
forth
end
end
“Muchas rutinas con esta estructura” (rotar, trasladar, …)
23
Figura Compuesta con herencia múltiple
FIGURA*
visualizar
girar
…
LISTA[FIGURA]
start
after
forth
FIGURA_COMPUESTA
visualizar
girar
…
girar(…) is do
from start
until after
loop
item.girar(…)
forth
end
end
“Muchas rutinas con esta estructura” (rotar, trasladar, …)
24
Patrón Composite: Herencia simple
Componente
operacion
Simple
operacion
Compuesto
operacion
componentes
for (Componente c ; componentes)
c.operacion();
25
Figura Compuesta con Herencia simple
Figura
dibujar
Poligono
dibujar
FiguraCompuesta
dibujar
componentes: LINKED_LIST[FIGURA]
dibujar is do
from componentes.start
until componentes.after
loop
end
end
componentes.item.dibujar
componentes.forth
26
Figuras Compuestas e Iteradores
coleccion:LINEAR_LIST[G]
forEach+
action*
...
LINEAR_ITERATOR*
redefine coleccion
FIGURA_COMPUESTA
visualizar is
local
iv: VISUALIZAR_ITERATOR
coleccion
FIGURA_COMPUESTA_ITERATOR*
action +
do
end
!!iv.make(Current)
iv.forEach
VISUALIZAR_ITERATOR
action (f: FIGURA) is do
f.visualizar
end
27
Figuras Compuestas e Iteradores
coleccion:LINEAR_LIST[G]
forEach+
action*
...
LINEAR_ITERATOR*
redefine coleccion
FIGURA_COMPUESTA
coleccion
FIGURA_COMPUESTA_ITERATOR*
ir: ROTAR_ITERATOR
!!ir.make(Current)
ir.forEach
rotar is
local
do
end
action +
VISUALIZAR_ITERATOR
action (f: FIGURA) is do
f.visualizar
end
action +
...
ROTAR_ITERATOR
action (f: FIGURA) is do
f.rotar
28
end
S
E
R
O
D
A
R
E
T
I
+
S
A
T
S
E
U
P
M
O
C
S
A
R
U
G
I
F
deferred class FIGURA_COMPUESTA_ITERATOR inherit
LINEAR_ITERATOR [FIGURA_COMPUESTA]
redefine coleccion end
creation make
feature
coleccion: FIGURA_COMPUESTA
-- Colección sobre la que itera (lista de figuras)
-- antes era Linear_List[G]
…
end
class VISUALIZAR_ITERATOR inherit
redefine action end
FIGURA_COMPUESTA_ITERATOR
creation make
feature
action(f: FIGURA) is do
end
f.visualizar
end
29
feature
...
visualizar is
local
do
end
...
S
E
R
O
D
A
R
E
T
I
+
S
A
T
S
E
U
P
M
O
C
S
A
R
U
G
I
F
class FIGURA_COMPUESTA inherit
FIGURA
LINKED_LIST[FIGURA]
iv: VISUALIZAR_ITERATOR
!!iv.make (Current)
-- colecciOn:= Figura_compuesta actual
iv.forEach
end
“NO HAY NADA MALO EN TENER CLASES TAN PEQUEÑAS”
“NO ES ACEPTABLE PASAR RUTINAS COMO ARGUMENTOS”
(B. Meyer)
30
3.- Problemas con la Herencia Múltiple
• (3.a) Colisión de nombres
{f}
{f}
A
B
C
Sol
Comentarios de: TEMA 5 Herencia Múltiple (0)
No hay comentarios