PDF de programación - TEMA 5 Herencia Múltiple

Imágen de pdf TEMA 5 Herencia Múltiple

TEMA 5 Herencia Múltiplegráfica de visualizaciones

Publicado el 7 de Julio del 2017
1.099 visualizaciones desde el 7 de Julio del 2017
572,2 KB
79 paginas
Creado hace 16a (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
  • Links de descarga
http://lwp-l.com/pdf5017

Comentarios de: TEMA 5 Herencia Múltiple (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad