PDF de programación - Tema 3 - Herencia

Imágen de pdf Tema 3 - Herencia

Tema 3 - Herenciagráfica de visualizaciones

Publicado el 24 de Junio del 2017
1.001 visualizaciones desde el 24 de Junio del 2017
1,2 MB
112 paginas
Creado hace 16a (30/01/2008)
TEMA 3

HERENCIA

Cristina Cachero, Pedro J. Ponce de León

versión 3
(3 sesiones)

Depto. Lenguajes y Sistemas Informáticos

Tema 3. HERENCIA
Objetivos

 Entender el mecanismo de abstracción de la herencia.

 Distinguir entre los diferentes tipos de herencia

 Saber implementar jerarquías de herencia en C++

 Saber discernir entre jerarquías de herencia seguras (bien definidas) e

inseguras.

 Reutilización de código: Ser capaz de decidir cuándo usar herencia y

cuándo optar por composición.

2

Herencia
Del tema anterior…

Persistente

No persist.

Entre objetos

 Asociación

 Todo-Parte

 Agregación
 Composición

Entre clases

 Generalización

C1

C2

 Uso (depend)

C1

C2

3

vehiculo aéreoavionhelicoptero HERENCIA
Motivación

Florista
cobrar()

darRecibo()

Panadero
cobrar()

darRecibo()

. . . .

Vendedor

coches

cobrar()

darRecibo()

Asociamos ese
comportamiento
a una categoría

general

(generalización)

Dependiente

cobrar()

darRecibo()

CLASE DERIVADA (C++)

CLASE HIJA
SUBCLASE

CLASE BASE (C++)

CLASE PADRE
SUPERCLASE

4

HERENCIA
Definición

 La herencia es el mecanismo de implementación mediante
el cual elementos más específicos incorporan la estructura
y comportamiento de elementos más generales
(Rumbaugh 99)

 Gracias a la herencia es posible especializar o extender la
funcionalidad de una clase, derivando de ella nuevas clases.
 La herencia es siempre transitiva: una clase puede heredar

características de superclases que se encuentran muchos niveles más
arriba en la jerarquía de herencia.
 Ejemplo: si la clase Perro es una subclase de la clase Mamífero, y la clase
Mamífero es una subclase de la clase Animal, entonces el Perro heredará
atributos tanto de Mamífero como de Animal.

5

HERENCIA
Test “ES-UN”

 La clase A se debe relacionar mediante herencia con la

clase B si “A ES-UN B”. Si la frase suena bien, entonces
la situación de herencia es la más probable para ese caso
 Un pájaro es un animal
 Un gato es un mamífero
 Un pastel de manzana es un pastel
 Una matriz de enteros es un matriz
 Un coche es un vehículo

6

HERENCIA
Test “ES-UN”

 Sin embargo, si la frase suena rara por una razón u otra,

es muy probable que la relación de herencia no sea lo más
adecuado. Veamos unos ejemplos:
 Un pájaro es un mamífero
 Un pastel de manzana es una manzana
 Una matriz de enteros es un entero
 Un motor es un vehículo

 De todas formas, puede haber casos en los que este test

puede fallar y sin embargo la relación de herencia es
evidente. Sin embargo, para la mayor parte de los casos,
la aplicación de esta técnica es adecuada.

7

HERENCIA
Principales usos

 La herencia como reutilización de código: Una clase

derivada puede heredar comportamiento de una clase
base, por tanto, el código no necesita volver a ser escrito
para la derivada.

 La herencia como reutilización de conceptos: Esto

ocurre cuando una clase derivada sobrescribe el
comportamiento definido por la clase base. Aunque no se
comparte ese código entre ambas clases, ambas
comparten el prototipo del método (comparten el
concepto).

8

Clasificación y generalización
 La mente humana clasifica los conceptos de acuerdo a dos

dimensiones:
 Pertenencia (TIENE-UN) -> Relaciones todo-parte
 Variedad (ES-UN) -> Herencia

 La herencia consigue clasificar los tipos de datos

(abstracciones) por variedad, acercando un poco más el
mundo de la programación al modo de razonar humano.
 Este modo de razonar humano se denomina GENERALIZACIÓN,

y da lugar a jerarquías de generalización/especialización.
 La implementación de estas jerarquías en un lenguaje de

programación da lugar a jerarquías de herencia.

9

Herencia como implementación de la
Generalización
 La generalización es una relación semántica entre

clases, que determina que la interfaz de la subclase
debe incluir todas las propiedades públicas y privadas
de la superclase.

 Disminuye el número de relaciones (asociaciones y

agregaciones) del modelo

 Aumenta la comprensibilidad, expresividad y

abstracción de los sistemas modelados.

 Todo esto a costa de un mayor número de clases

11

Tipos de Herencia

 Simple/Múltiple
 De implementación/de interfaz

 A nivel semántico, Bertrand Meyer distingue 17

tipos de herencia.

12

Tipos de Herencia

 Simple/Múltiple

 Simple: única clase base

 Múltiple: Más de una clase base

13

Tipos de Herencia

 De implementación/de interfaz

 De implementación: La implementación de los métodos
es heredada. Puede sobreescribirse en las clases hijas.

 De interfaz: Sólo se hereda la interfaz, no hay

implementación a nivel de padre (interfaces en Java,
clases abstractas en C++)

14

Herencia
Caracterización

 Atributos de la generalización

 Solapada/Disjunta

 Determina si un objeto puede ser a la vez instancia de dos o más subclases de

ese nivel de herencia.

 C++ no soporta la herencia solapada (tipado fuerte)

 Completa/Incompleta

 Determina si todas las instancias de la clase padre son a la vez instancias de

alguna de las clases hijas (completa) o, por el contrario, hay objetos de la clase
padre que no pertenecen a ninguna subcategoría de las reflejadas por las clases
hijas (incompleta).

 A nivel de implementación, una jerarquía de herencia completa suele implicar que
la clase padre puede ser definida como abstracta (es decir, impedir que se creen
instancias de ella).

 Estática/Dinámica

 Determina si un determinado objeto puede pasar de ser instancia de una clase

hija a otra dentro de un mismo nivel de la jerarquía de herencia.

 C++ no soporta la herencia dinámica (tipado fuerte)

16

Herencia
Caracterización: ejemplos

17

HERENCIA

Herencia Simple

Herencia Simple en C++

class Figura2D {
public:
Figura2D(Coordenada posicion, Color c);
...
Color getColor();
void setColor(Color c);
private:
Coordenada origen;
Color colorRelleno;
};

class Circulo : Figura2D {
...
public:
void vaciarCirculo() {
colorRelleno=NINGUNO;
// ¡ERROR! colorRelleno es privado
setColor(NINGUNO); // OK
}
};

int main() {
Circulo c;
c.setcolor(AZUL);
c.getColor();

...
}

19

Herencia en C++
Visibilidad atributos/métodos

 C++ introduce un nuevo ámbito de visibilidad para el tratamiento de la

herencia: protected
 Los datos/funciones miembros protected son privados para todas aquellas

clases no derivadas y métodos externos, pero accesibles para una clase
derivada de la clase en que se ha definido la variable protegida.

class Figura2D {
...

protected:
Color colorRelleno;

...
};

int main () {
Circulo c;
c.colorRelleno=NINGUNO;
// ¡ERROR! colorRelleno
// es privado aquí
}

class Circulo : Figura2D {

public:
void vaciarCirculo() {
colorRelleno=NINGUNO; //OK, protected
}

...
};



20

Tipos de Herencia Simple (en C++)

 Herencia Pública (por defecto)

class Circulo : public Figura2D {
...
};

 Herencia Protegida

class Circulo : protected Figura2D {
...
};

 Herencia Privada

class Circulo : private Figura2D {
...
};

<<public>>

<<protected>>

<<private>>

21

Tipos de Herencia Simple

Ámbito
Herencia

Visibilidad
en clase base

Private

Protected

CD (*)
H. Pública
No direct.
accesible
Protected

CD
H. Protegida
No direct.
accesible
Protected

CD
H. privada
No direct.
accesible
Private

Public

Public

Protected

Private

(*) CD: Clase derivada

22

Tipos Herencia Simple
Ejercicio

Abuela

+ publico: int
# protegido: int
- privado: int
+ setPublicoAbuela(int)
+ setProtegidoAbuela(int)
+ setPrivadoAbuela(int)
+ inicializaTodoAUno();

Padre

<<??>>

+inicializaTodoAUno()

<<public>>

Implementa el método
Hija::inicializaTodoAUno() suponiendo
que la herencia entre Abuela y Padre es:
•Pública
•Protegida
•Privada

Hija

+inicializaTodoAUno()

23

Herencia Simple

 En la clase derivada se puede:

 AÑADIR nuevos métodos/atributos propios de la

clase derivada

 Modificar los métodos heredados de la clase base

 REFINAR: se añade comportamiento nuevo

antes y/o después del comportamiento heredado.
(Simula, Beta) (se puede simular en C++, Java)
 C++, Java: Constructores y destructores se

refinan

 REEMPLAZAR: el método heredado se redefine

completamente, de forma que sustituye al original
de la clase base.

25

El constructor en herencia simple

 Los constructores no

se heredan
 Siempre son definidos para

las clases derivadas

 Creación de un objeto de

clase derivada: Se invoca a
todos los constructores de
la jerarquía

 Orden de ejecución de

constructores: Primero se
ejecuta el constructor de la
clase base y luego el de la
derivada.

26

El constructor en herencia simple

 Esto implica que la clase derivada aplica una

política de refinamiento: añadir comportamiento
al constructor del padre.

 Ejecución implícita del constructor por defecto de

clase base al invocar a un constructor de clase
derivada.

 Ejecución explícita de cualquier otro tipo de

constructor en la zona de inicialización
(refinamiento explícito). En particular, el
constructor de copia.

(CONSEJO: Inicialización de atributos de la clase base: en

la clase base, no en la derivada)

27

El destructor en herencia simple

 El destructor no se

hereda.
 Siempre es definido para

la clase derivada

 Destrucción de un objeto

de clase derivada: se
invoca a todos los
destructores de la
jerarquía

 Primero se destruye el

objeto derivado y luego el
objeto base.

 Llamada implícita a los
destructor de la clase
base.

28

Construccion/destrucción en resumen…

 Los objetos se destruyen en orden inverso

al de construcción.

29

Ejemplo Clase Base

TCuenta

# titular: string
# saldo: double
# interes: double
# numCuentas: int
+ TCuenta()
+ TCuenta(TCuenta &)
+ operator=()
+ ~TCuenta()
+ getTitular()
+ getSaldo()
+ getInteres()
+ setSaldo()
+ setInteres()
+ abonarInteresMensual()
+ mostrar()
<<friend>> operator<<()

30

Herencia Simple (base): TCuenta

class TCuenta{
public:
TCuenta(string t, double
  • Links de descarga
http://lwp-l.com/pdf4583

Comentarios de: Tema 3 - Herencia (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