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.
Comentarios de: Programación II - Herencia y Polimorfismo (0)
No hay comentarios