PDF de programación - TEMA 5 Herencia Múltiple - Programación Orientada a Objetos

Imágen de pdf TEMA 5 Herencia Múltiple - Programación Orientada a Objetos

TEMA 5 Herencia Múltiple - Programación Orientada a Objetosgráfica de visualizaciones

Publicado el 31 de Mayo del 2018
772 visualizaciones desde el 31 de Mayo del 2018
543,7 KB
42 paginas
Creado hace 17a (08/01/2007)
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.

– Colisión de nombres
– Herencia repetida

• Conflicto cuando hay compartición
• Conflicto cuando hay duplicación

4.- Herencia múltiple en Java: Interfaces

2

•1

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

•2

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

•3

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

•4

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

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_CORRIENTE

10

•5

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

•6

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

•7

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”

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

15

16

•8

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 [G]

PILA [G]*

LINKED_LIST [G]

export [NONE] all

export [NONE] all

PILA_FIJA [G]+

PILA_ENLAZADA [G]+

• 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].

18

•9

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 [G]

PILA [G]*

LINKED_LIST [G]

export [NONE] all

export [NONE] all

PILA_FIJA [G]+

PILA_ENLAZADA [G]+

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 [G] inherit

PILA [G]
ARRAY [G] export {NONE} all

rename

end

creation make
feature

put as array_put, make as array_make,
count as capacity

count: INTEGER; --hace efectiva como atributo una

--característica diferida

make (n: INTEGER) is

require tamaño_no_negativo: n>=0;
do

array_make (1,n)

ensure

capacidad: capacity = n;
vacia: count = 0

end

20

•10

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

full: BOOLEAN is do

--¿Está llena la representación de la pila?

Result:= (count = capacity)

end;

put (x: G) is

-- 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 [G]

Problema en ejecución

Sea la declaración

entonces

p: PILA_FIJA [INTEGER]
p.array_put (32,45)

provocaría error en tiempo de compilación.

¿Provocaría error el siguiente código?

p: PILA_FIJA [INTEGER]; a: ARRAY [INTEGER]
...
a:= p
a.put (32,45)

{se ejecuta la rutina put de array}

21

22

•11

Herencia de implementación

ARRAY [G]

PILA [G]*

Result:= (count = capacity)

PILA_FIJA [G]+
full: BOOLEAN is do
end;
put (x: G) is do

count:= count + 1;
array_put (x, count)

end;

23

¿Cómo se haría sin herencia de implementación?

PILA [G]*

ARRAY [G]

imp

Penalización rendimiento
Tedioso uso prefijos

Result:= (count = imp.capacity)
Result:= (count = capacity)

PILA_FIJA [G]+
full: BOOLEAN is do
full: BOOLEAN is do
end;
end;
put (x: G) is do
put (x: G) is do

count:= count + 1;
count:= count + 1;
imp.put (x, count)
array_put (x, count)

end;
end;

Toda manipulación de la representación requiere una llamada a una
característica de ARRAY con imp como receptor.

24

•12

Clientela vs. Herencia de implementación

• “B hereda de A” es una decisión de diseño más comprometedora

que “B es cliente de A”.

• Si “B es cliente de A” podemos cambiar la implementación de A

sin afectar a B.

¿Cuándo es apropiada una herencia de implementación?

• “Cuando la elección de la implementación es una parte esencial del

diseño de la clase, y no va a cambiar, como en PILA_FIJA [G]”

• En ese caso ofrece una solución más simple, eficiente y legible.

C++ y Herencia de implementación

A

{f,g}

C

B

C* oc; A* oa; B* ob
oa = ob
{ERROR}
ob.f( ) {ERROR}

class A {

public:

void f ( );
void g ();

protected:...
private:...}

class B: private A {

public: ...
protected:...
private:...}

25

26

•13

Ocultar las propiedades del padre
• Eiffel:

– export {NONE}
– class Pila inherit Array export {NONE} ALL

• C++:

– herencia privada
– class Pila: private Array{...};

• Java:

– throw new UnsupportedOperationException();
– invocar con super a las propiedades del padre
– class Pila extends Array{

}

throw new UnsupportedOperationException();

public void add(int pos, Object valor) {
}
public void push(Object valor){
}

super.add(tope,valor);

27

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”
28

•14

Figura Compuesta con herencia múltiple

FIGURA*
visualizar

girar


LISTA[FIGURA]

start
after
forth

FIGURA_COMPUESTA

visualizar

girar


visualizar is do
girar(…) is do

from start until after
from start until after
loop
loop

item.visualizar
item.girar(…)
forth
forth

end
end

end
end

“Muchas rutinas con esta estructura” (rotar, trasladar, …)

29

Patrón Composite: Herencia simple

Componente

operacion

Simple

operac
  • Links de descarga
http://lwp-l.com/pdf11489

Comentarios de: TEMA 5 Herencia Múltiple - Programación Orientada a Objetos (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