PDF de programación - Programación II - Herencia y Polimorfismo

Imágen de pdf Programación II - Herencia y Polimorfismo

Programación II - Herencia y Polimorfismográfica de visualizaciones

Publicado el 3 de Diciembre del 2018
447 visualizaciones desde el 3 de Diciembre del 2018
116,9 KB
25 paginas
Creado hace 14a (23/04/2010)
23/04/2010

Programación II

Herencia y Polimorfismo

Ángel Lucas González Martínez

Jaime Ramírez Rodríguez

Guillermo Román

DLSIIS. Facultad de Informática
Universidad Politécnica de Madrid

Clases como conjuntos

• Una clase la podemos ver como un conjunto, y

por lo tanto los objetos de esa clase los
por lo tanto los objetos de esa clase los
podemos ver como miembros de ese conjunto.
• Una subclase o clase hija de una clase (padre)

A, la podemos considerar un subconjunto del
conjunto A.
De esta forma los elementos que pertenecen a
– De esta forma los elementos que pertenecen a
un subconjunto pertenecen también al conjunto
más general

2

1

23/04/2010

Generalización de clases

•Una clase hija es una correcta
subclase de una clase padre si
cumple las siguientes reglas:
• Regla Es-un: todos los objetos

(miembros) de una clase hija
(subconjunto) son objetos también de
la clase padre (conjunto).

• Regla del 100%: el 100% de la

definición de la clase padre debe ser
parte de la definición de la clase hija,
es decir:
– La clase hija debe incorporar al menos

los atributos de la clase padre

– La clase hija debe saber realizar al
menos las operaciones de la clase
padre ⇒la debe poder sustituir en
cualquier contexto

Vehiculo

velocidad
-velocidad
-carga

+desplazarsePorSuperficie()
+cargar()
+descargar()

VehiculoMotorizado

-cargaCombustible

+encender()
+apagar()

VehiculoManual

Avión

-altitud

+volar()

Submarino

-profundidad

+navegarBajoMar()

Bi i l t
Bicicleta

+pedalear()

miBici : Bicicleta

3

Herencia de clases

• Es un mecanismo que incorporan los lenguajes OO
que permite implementar una clase (derivada) a partir de
que permite implementar una clase (derivada) a partir de
otra clase (base) de forma que:
– La clase derivada incluye todos los atributos de la

clase base

– La clase derivada incluye todos los métodos definidos

en la clase base.

⇒ es un mecanismo para reutilizar código ya existente
⇒ es un mecanismo para reutilizar código ya existente

que permite evitar la duplicidad de código

• USO CORRECTO: solo se debe usar cuando la clase

derivada sea conceptualmente una subclase de la clase
base.

4

2

23/04/2010

Herencia de clases en Java

derivada o subclase de una clase padre
derivada o subclase de una clase padre.

• Java permite definir una clase como clase
Class ClaseHija extends ClasePadre
{
..........
}

Clase Padre

Clase Hija

5

Herencia en Java

• No permite la herencia múltiple (sólo un padre)
• Todas las clases derivan implícitamente de
• Todas las clases derivan implícitamente de

Object

• Una clase derivada (o subclase) puede acceder

directamente a todos los atributos y métodos
heredados que no sean private

• Se permite la especialización o redefinición de

p

p

servicios de la clase padre (sobreescribir
/redefinir), por ejemplo, el equals().

6

3

23/04/2010

Constructores y Herencia

j

,

• Cuando se declara un objeto de una clase
derivada, se ejecutan los constructores
siguiendo el orden de derivación, es decir,
primero el de la clase base (padre), y después
los de las clases derivadas (hijas) de arriba a
abajo.

• Para pasar parámetros al constructor de la clase

padre:

super (para1, para2, ..., paraN)
N)

1

2

(

• Si el padre no tiene constructor por defecto hay

que llamar a super obligatoriamente

7

8

Constructores y Herencia

class Persona {
private String nombre;
private int edad;
p
;
public Persona() {}
public Persona (String nombre, int edad)
{ this.nombre = nombre; this.edad = edad; }
}

class Alumno extends Persona {
private int curso;
private String nivelAcademico;
public Alumno (String nombre, int edad, int curso, String nivel) {
super(nombre edad);
super(nombre, edad);
this.curso = curso; nivelAcademico = nivel;

}
public static void main(String[] args) {
Alumno a = new Alumno("Pepe", 1, 2, "bueno");
}}

4

23/04/2010

Referencias a objetos de clases hijas

• Si tenemos ClaseHijo hijo = new ClaseHijo(...);
• Entonces es posible padre=hijo donde padre es
Entonces es posible padre hijo donde padre es
una variable de tipo ClasePadre
– No es posible hijo=padre
– Es posible con casting hijo= (ClaseHijo) padre. Si

padre no contiene una instancia de la clase hija
se produce la excepción:

java.lang.ClassCastException
j
• Ahora bien:

g

– Con padre sólo podemos acceder a atributos y

métodos de la clase padre

9

Referencias a objetos de clases hijas

public static void main(String[] args) {
Persona persona;
Alumno alumno = new Alumno(“pepe”,23,1,”universitario”);
persona = alumno; //ref padre señala al objeto hijo
// acceso al objeto hijo mediante la ref padre
persona.setEdad(24);
/* no es posible acceder a un miembro de la clase hija usando una ref

a la clase padre*/

persona.setCurso(88); // ERROR
((Alumno)persona).setCurso(88); // Esto es correcto
}

10

5

23/04/2010

Ejercicio

Los constructores
no se ponen

• Crear una clase Persona con nombre(String) y edad (int)

– Implementar el constructor que inicialice el nombre y

la edad con parámetros de entrada

• Crear una clase Trabajador que herede de Persona y

t
)
tenga un número de la seguridad social (String)

l (St i

id d

d l

ú

i

– Implementar el constructor con todos los atributos

de la clase con parámetros de entrada

• Crear una clase Empleado que herede de Trabajador y

tenga un atributo sueldo (double)

– Implementar el constructor con todos los atributos

de la clase con parámetros de entrada

• Crear una clase Directivo que herede de Empleado y

tenga el atributo (double) bonus

– Implementar el constructor con todos los atributos

de la clase con parámetros de entrada

• Crear una clase ConsultorExterno que herede de

Trabajador y tenga tarifa (double) y horas (double) y una
empresa (String)

– Implementar el constructor con todos los atributos

de la clase con parámetros de entrada

Persona

-String nombre
-int edad

Trabajador

-String numSegSocial

Empleado

-double sueldo

Directivo

-double bonus

ConsultorExterno

-double tarifa
-double horas
-String empresa

11

Redefinir funciones miembros de la

clase padre

• Una clase hija puede completar o cambiar el

comportamiento de un método (sobre escribir)
comportamiento de un método (sobre escribir)

• El método redefinido debe cumplir:

– Ofrecer al menos una POST igual o más fuerte
– Exigir como mucho una PRE igual o más débil

• El método redefinido puede usar la
(

implementación dada por el padre (super)
i
)
– O usar cualquier otro método accesible, tanto del

ió d d

d

t

l

l

padre como de sí mismo

12

6

23/04/2010

Redefinir funciones miembros de la

clase padre

class Persona {
private String nombre;
private int edad;
p ate
t edad;
...................
public String toString() { return nombre + “ ” +edad; }
public void setEdad(int edad) { this.edad = edad; }

}

class Alumno extends Persona {
private int curso;
private String nivelAcademico;
...................
public String toString() {
return super.toString() + curso + nivelAcademico;
}
public void setCurso(int curso) { this.curso = curso; }

}

Se usa la implementación del padre

13

Polimorfismo



[RAE 2001]: Cualidad de lo que tiene o puede tener
distintas formas

• El polimorfismo en POO se da por el uso de la herencia
• Se produce por distintas implementaciones de los

métodos definidos en la clase padre (sobre escribir):
– Distinta implementación entre clase hija y padre
– Distinta implementación entre clases hija
• Una misma llamada ejecuta distintas sentencias
Una misma llamada ejecuta distintas sentencias
dependiendo de la clase a la que pertenezca el objeto

• El código a ejecutar se determina en tiempo de

ejecución => Enlace dinámico

14

7

23/04/2010

Polimorfismo

• Supongamos que declaramos: Persona p;
• Podría referenciar a un profesor o a un alumno en

p

distintos momentos

• Entonces:

– Si p referencia a un alumno, con p.toString(), se

ejecuta el toString de la clase Alumno.

– Si p referencia a un profesor, con p.toString(), se

ejecuta el toString de la clase Profesor.

Enlace dinámico: Se decide en tiempo de ejecución
• Enlace dinámico: Se decide en tiempo de ejecución
qué implementación del método se ejecuta.

• OJO!: la Sobrecarga de funciones no es lo mismo,

utiliza enlace estático, por tanto se decide en tiempo de
compilación.

15

16

Ejemplo Personas

Persona

-String nombre
-int edad

+cambiarEdad(int edad)

Alumno

-String nota

+cambiarNota(String nota)
+calcularGastosMatricula()

Medico

-String especialidad

+recetar(Persona p)

Profesor

-String asignatura

+darClase()

AlumnoLibre

AlumnoPresencial

-int numAsignaturas

-int curso

+calcularGastosMatricula()

+calcularGastosMatricula()

8

23/04/2010

Ejemplo de Polimorfismo

class Persona { ................... }
class Alumno extends Persona {
......................
public String toString() {

return super.toString() + curso + nivelAcademico;
}

}
class Profesor extends Persona {
private String asignatura;
public Profesor (String nombre, int edad, String asignatura) {
super(nombre, edad);
this.asignatura = asignatura;
}
public String toString() {
return super.toString() + asignatura;
}

}

17

18

Ejemplo de Polimorfismo

public static void main(String[] args) {
Persona v[]=new Persona[10];
// Se introducen alumnos, profesores y personas en v
// Se introducen alumnos, profesores y personas en v
for (int i=0 ; i<10; i++){
/*Se piden datos al usuario de profesor, alumno o persona */
switch (tipo) {
case /* profesor */: v[i] = new Profesor (….); break;
case /* alumno */: v[i] = new Alumno(…); break;
case /* persona */: v[i] = new Persona(…); break;
default: /* ERROR */ }}
}

for (int i=0 ; i<10; i++)
System.out.println(v[i]);// enlace dinámico con toString()

}

9

¿Cómo sería sin polimorfismo?

• No tendríamos enlace dinámico.
Necesitaríamos otro switch en el segundo for para cada una
• Necesitaríamos otro switch en el segundo for para cada una
de las clases que queramos tratar.
  • Links de descarga
http://lwp-l.com/pdf14400

Comentarios de: Programación II - Herencia y Polimorfismo (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