PDF de programación - TEMA 3 Herencia (2ª parte)

Imágen de pdf TEMA 3 Herencia (2ª parte)

TEMA 3 Herencia (2ª parte)gráfica de visualizaciones

Publicado el 7 de Julio del 2017
641 visualizaciones desde el 7 de Julio del 2017
429,3 KB
48 paginas
Creado hace 16a (03/12/2007)
Programación Orientada a Objetos

TEMA 3

Herencia
(2ª parte)

Facultad de Informática
Universidad de Murcia

Índice
1.- Introducción
2.- Adaptaciones del lenguaje:

- Redefinición vs. Renombramiento
- Cambios en el nivel de visibilidad

3.- Herencia y creación
4.- Polimorfismo y ligadura dinámica
5.- Genericidad

- Estructuras de datos polimórficas
- Genericidad restringida

6.- Clases abstractas/diferidas

2

1.-Introducción

• La herencia es un mecanismo que posibilita la
definición de una clase a partir de otra dando soporte
para
relaciones de
especialización o generalización existentes entre las
clases.

registrar y utilizar

las

• La herencia organiza las clases en una estructura

jerárquica que puede tener o no una clase raíz:
– Java:
– Eiffel:
– C++:
– C#:

clase Object
clase ANY
no existe una clase raíz
clase System.Object

Tema4: Herencia

3

1.- Introducción

• Terminología:
– B hereda de A
– Java:

• B es subclase de A
• A es superclase de B

– Eiffel:

• B es descendiente de A
• A es un ascendiente de B

– C++:

• B es una clase derivada de A
• A es la clase base de B

– C#:

• B es la clase hija de A
• A es la clase padre o clase base de B

Tema4: Herencia

4

2.- Adaptaciones del lenguaje

• Cuando una clase B hereda de una clase A:

– B puede añadir nuevos atributos
– B puede añadir nuevos métodos
– B puede redefinir los métodos de A

• Refinamiento vs. Reemplazo

– B puede renombrar los métodos de A
– B puede implementar métodos abstractos de A
– B puede cambiar el nivel de visibilidad de los

atributos y métodos heredados

• Las adaptaciones dependen del lenguaje

Tema4: Herencia

5

Adaptaciones en Eiffel

• Renombramiento:

– Cambiamos el nombre de la característica
– Es un mecanismo sintáctico
– Cláusula rename
– Utilidad:

• Solucionar las colisiones de nombres
• Proporcionar nombres más adecuados

• Redefinición:

– Cambiamos la versión de la característica
– Es un mecanismo semántico
– Cláusula redefine
– Utilidad:

• Refinamiento
• Reemplazo

Tema4: Herencia

6

Ejemplo renombramiento

class Pila
rename

inherit Array

put as array_put,
remove as array_remove,
end

....

end

Tema4: Herencia

7

Renombrar & Redefinir

• Una característica con nombre final f en la clase C
podrá tener un nombre original g distinto en la clase
origen A dónde se introdujo inicialmente.

• Cada característica f de una clase C tiene un nombre

final en C, que se define según
– Si f es inmediato:

nombre final = nombre original

– Si f es heredado de A y no se renombra:

nombre final = nombre final en A

– Si f es heredado de A y se renombra

nombre final = “nuevo nombre”

Tema4: Herencia

8

Combinar redefinir y renombrar

B {fα,gδ,hφ}

C {nfβ, gγ, hφ}

class C inherit

B

rename f as nf
redefine g, nf

end;
feature

nf is do .. end;
g is do .. end;

...
end

-- debe ir antes de redefine

Clase
donde
está

Clase
origen

Nombre

final

Nombre
original Versión

B

B

B

C

C

C

B

B

B

B

B

B

f

g

h

nf

g

h

f

g

h

f

g

h

α

δ

φ

β

γ

φ

* Ejercicio 1:
{fα}

A

rename f as g

B

{gα}
* Ejercicio 2:
{fα}

A

rename f as g
redefine g

B

{gβ}

Tema4: Herencia

oa: A; ob: B

!!ob
oa:= ob
oa.f
oa.g
ob.f
ob.g

-- {α}
-- {error t.c.}
-- {error t.c.}
-- {α}

oa: A; ob: B

!!ob
oa:= ob
oa.f
oa.g
ob.f
ob.g

-- {β}
-- {error t.c.}
-- {error t.c.}
-- {β}

10

* Ejercicio 3:

B

{fα, gβ}

rename f as h
redefine h

C

{hδ, iγ }

-- se ejecuta α
-- se ejecuta β

ob: B; oc: C
!!ob;
ob.f ()
ob.g()
ob:= oc
ob.f ()
ob.i ()
oc.h () -- se ejecuta δ
oc.f ()

-- se ejecuta δ
-- error en compilación

-- error en compilación

Clase
B

B

C

C

C

Nombre final

Nombre original Versión Clase Origen

f

g

h

g

i

f

g

f

g

i

α

β

δ

β

γ

B

B

B

B

C

Tema4: Herencia

11

Ejercicio 4

class C inherit

A

B

rename f as g;

rename f as h;
redefine h;

feature

h is do … end
f is do … end

end

oa: A; ob: B; oc: C;

!!oc;

oc.f;
oc.g;
oc.h;

oa:= oc;

oa.f;
oa.g;

ob:= oc;

ob.f;
ob.h;

Tema4: Herencia

12

Redefinición en Eiffel

• ¿Qué podemos cambiar?

– Tipo de las características (Regla covariante)
– Implementación

• Solicita explícitamente mediante la cláusula redefine.

• No es necesario incluirlo cuando se redefine para hacer efectiva una

característica.

• Técnicas que le añade potencia:

a)Redefinir una función como un atributo

• Aplicación del Principio de Acceso Uniforme
• Un atributo no se puede redefinir como una función

b)El uso de la versión original en una redeclaración
• “Facilita la tarea al que redefine si el nuevo trabajo incluye el viejo”.

Tema4: Herencia

13

Ejemplo: Regla covariante en Eiffel

sustituto

Dispositivo

Impresora

sustituto

Regla de Redeclaración de Tipo (Eiffel)

Una redeclaración de una característica puede reemplazar el tipo de la
característica (si es un atributo o una función), o el tipo de un argumento
formal (si es una rutina) por cualquier tipo compatible con el original.

Tema4: Herencia

14

Ejemplo: Redefinir una función como un atributo

Result:= ingresos.total -reintegros.total

class Cuenta1 feature

saldo: INTEGER is do
end

...end
class Cuenta2 inherit
feature
...end

Cuenta1 redefine saldo end
saldo:INTEGER

Tema4: Herencia

15

Uso de la versión original en Eiffel

• Entidad Precursor = llamar a la versión de esta característica

en la clase padre.

• Su uso está limitado al cuerpo de las rutinas redefinidas

– ¿Equivale a super en Java?

• Ejemplo: Dibujar un botón es mostrarlo como una ventana y luego dibujar

el borde
VENTANA

dibujar is do ... end

BOTON

dibujar is do

Precursor
dibujar_borde

end

Tema4: Herencia

16

Herencia y Ocultación de Información en Eiffel

• Son mecanismos independientes
• Una clase B es libre de exportar o de esconder una característica

f que hereda de un antecesor A.

A {f}

B

f exportada en A y B
f privada en A y B
f exportada en A y oculta en B
f oculta en A y exportada en B

• Por defecto f mantiene el status de exportación que tenía en A,

pero se puede cambiar mediante la clausula export.

Tema4: Herencia

17

¿Por qué dejar que cada descendiente escoja la

política de exportación en Eiffel?

• Flexibilidad y Extensibilidad:

– La herencia es la clave del Principio Abierto-Cerrado

• La propiedad básica de la herencia es permitir definir

descendientes de una clase no previstos en su creación.

• ¿Cómo sabemos a priori que propiedades exportará o no

una subclase no prevista?

• La herencia sólo debe estar limitada por los asertos y las

reglas de tipado.

Tema4: Herencia

18

“Agujero de tipos” en Eiffel

• Violación del sistema de

tipos debido a las
asignaciones polimórficas

Array

put(elem, index)
remove(elem, index)

rename …
export{NONE}ALL
put(elem)
remove(elem)

Pila

Sea la declaración:

p: PILA[INTEGER]

p.array_put(32,45) //Error tc

¿Provocaría un error el

siguiente código?

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

¿Cuál es la alternativa a la herencia de implementación?

Tema4: Herencia

19

Redefinición en C++

• Clase base contiene una función virtual vf
• Clase que se deriva de ella contiene una función vf del mismo tipo (si son distintos

se consideran funciones diferentes y no se invoca al mecanismo virtual)

class Base {

virtual void vf1();
virtual void vf2();
virtual void vf3();
void f();

//Ligadura dinámica

//Ligadura estática

};
class Derivada : public Base {
//redefine vf1
//distinta a vf2()
//error, difiere tipo devuelto

void vf1();
void vf2 (int);
char vf3();
void f();

};
• Llamada al padre calificando las rutinas. Ej: Base :: f()

}

void g()
{
Derivada *d;
Base* b;

...

b = d;
b -> vf1();
b -> vf2();
b -> f();
d-> vf2();

...

//Derivada::vf1
//Base::vf2
//Base::f
//ERROR

20

Herencia y Ocultación de Información en C++

• protected:

– sólo accesibles por la clase y sus descendientes

• Tipos de herencia:

– Herencia privada:

class B: private A {...}

• todas las propiedades de A se heredan como privadas
• se puede mantener el estatus calificando la rutina

– Herencia pública:

class B: public A {...}
• se mantiene el status de las propiedades heredadas (por defecto)
• un miembro private o protected no puede ser re-exportado, es
decir, protected no puede ser public y private no puede ser
ni protected ni public

• “agujero” debido asignaciones polimórficas (público puede pasar a

privado)

Tema4: Herencia

21

Herencia y exportación en C++
Se puede conservar el acceso si la herencia es privada, mencionando
su nombre calificado en la parte public o protected. Por
ejemplo:

public:
B::bf(); //hace que bf sea público en D
//ERROR intenta conceder acceso
B::a;
protected:
B::bf(); //ERROR intenta reducir acceso

Tema4: Herencia

22

};

class B{

int a; //private
public:
int bf();
protected:
int c;

};
class D: private B{

Todos los miembros de

B son privados en D

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:...}

Tema4: Herencia

23

Redefinición en C#

class Punto2D {
...public virtual string ToString(){
return “[” + x+ “,” + y + “]”;
}
...
}class Punto3D : Punto2D {
...public override string ToString(){
}

}

return base.ToString() + “[z=“ + z +”]”;

• Si se nos olvida poner override se entiende que estamos

ocultando el método de la clase padre.

• Toda redefinición de un método debe mantener el mismo nivel de

acceso que tuviese el método original.

Tema4: Herencia

24

Redefinición y ocultación en C# (1/2)

public virtual void F(){ Console.WriteLine(“A.F”);

public override void F(){ Console.WriteLine(“B.F”);

using System;
class A {

}
class B : A {

}
class C : B {

}
class D : C {

new public virtual void F(){Console.WriteLine(“C.F”);

public override void F(){ Console.WriteLine(“D.F”);

}

Tema4: Herencia
  • Links de descarga
http://lwp-l.com/pdf5012

Comentarios de: TEMA 3 Herencia (2ª parte) (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