Publicado el 14 de Enero del 2017
1.735 visualizaciones desde el 14 de Enero del 2017
239,9 KB
19 paginas
Creado hace 15a (03/03/2010)
Prácticas de Programación
Tema 1. Introducción al análisis y diseño de programas
Tema 2. Clases y objetos
Tema 3. Herencia y Polimorfismo
Tema 4. Tratamiento de errores
Tema 5. Aspectos avanzados de los tipos de datos
Tema 6. Modularidad y abstracción: aspectos avanzados
Tema 7. Entrada/salida con ficheros
Tema 8. Verificación y prueba de programas
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
© M. Aldea y M. González
8/03/10
Tema 3. Herencia y Polimorfismo
1
3.1. Herencia
3.2. Polimorfismo
3.3. La clase Object
3.4. Clases abstractas
3.5. Bibliografía
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
3.1 Herencia
Relación de herencia:
• todos los coches son vehículos
© M. Aldea y M. González
8/03/10
2
3.1 Herencia
Vehículo
Coche
La herencia es un mecanismo por el que se pueden crear nuevas
clases a partir de otras existentes,
• heredando, y posiblemente modificando, y/o añadiendo
operaciones
• heredando y posiblemente añadiendo atributos
Observar que una operación o atributo no puede ser suprimido en
el mecanismo de herencia
Nomenclatura
clase original
clase extendida
superclase
subclase
padre
hijo
Vehículo
Coche
Prácticas de Programación
© M. Aldea y M. González
8/03/10
3
Tema 3. Herencia y Polimorfismo
Herencia de operaciones
Al extender una clase
3.1 Herencia
• se heredan todas las operaciones del padre
• se puede añadir nuevas operaciones
La nueva clase puede elegir para las operaciones heredadas:
• redefinir la operación: se vuelve a escribir
- la nueva operación puede usar la del padre y hacer más
cosas: programación incremental
- o puede ser totalmente diferente
• dejarla como está: no hacer nada
La herencia se puede aplicar múltiples veces
• da lugar a una jerarquía de clases
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
© M. Aldea y M. González
8/03/10
Herencia en un diagrama de clases
3.1 Herencia
Figura
-Color
+dibuja()
+borra()
+cambiaColor()
superclase
Línea
-puntoInicio
-puntoFin
+dibuja()
+borra()
subclases
Círculo
-centro
-radio
+dibuja()
+borra()
+rellena()
• Los atributos y métodos de la superclase no se repiten en las
subclases
- salvo que se hayan redefinido
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
© M. Aldea y M. González
8/03/10
Ejemplo
Clase que representa un vehículo cualquiera
3.1 Herencia
Vehículo
-color: int
-numSerie: int
+color(): int
+numSerie(): int
+pinta(nuevoColor: int)
+cambiaNumSerie(nuevo: int)
Prácticas de Programación
© M. Aldea y M. González
8/03/10
4
5
6
Tema 3. Herencia y Polimorfismo
Ejemplo: clase Vehículo
3.1 Herencia
public class Vehículo
{
// constantes estáticas finales para los colores
public static final int
rojo=1,
verde=2,
azul=3;
// atributos
private int color;
private int numSerie;
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
© M. Aldea y M. González
8/03/10
7
3.1 Herencia
Ejemplo: clase Vehículo (cont.)
/**
* Obtener el numero de serie
*/
public int numSerie()
{
return numSerie;
}
/**
* Obtener el color
*/
public int color()
{
return color;
}
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
© M. Aldea y M. González
8/03/10
8
3.1 Herencia
Ejemplo: clase Vehículo (cont.)
/**
* Cambiar el numero de serie
*/
public void cambiaNumSerie(int numSerie)
{
this.numSerie=numSerie;
}
/**
* Pintar el vehículo de un color
*/
public void pinta(int nuevoColor)
{
color = nuevoColor;
}
}
Prácticas de Programación
© M. Aldea y M. González
8/03/10
9
Tema 3. Herencia y Polimorfismo
Ejemplo: extensión a la clase Coche
3.1 Herencia
Vehículo
-color: int
-numSerie: int
+color(): int
+numSerie(): int
+pinta(nuevoColor: int)
+cambiaNumSerie(nuevo: int)
Coche
-cilindrada: int
+cilindrada(): int
+cambiaCilindrada(nueva: int)
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
© M. Aldea y M. González
8/03/10
10
3.1 Herencia
Ejemplo: extensión a la clase Coche (cont.)
public class Coche extends Vehículo
{
// cilindrada del coche
private int cilindrada;
/** Obtiene la cilindrada del coche */
public int cilindrada(){
return cilindrada;
}
/** Cambia la cilindrada del coche */
public void cambiaCilindrada(int nuevaCilin) {
this.cilindrada=nuevaCilin;
}
}
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
© M. Aldea y M. González
8/03/10
Ejemplo: extensión a la clase Barco
11
3.1 Herencia
Se puede hacer herencia sin añadir métodos y/o atributos
public class Barco extends Vehículo
{
}
Prácticas de Programación
© M. Aldea y M. González
8/03/10
12
Tema 3. Herencia y Polimorfismo
Ejemplo: jerarquía de clases
3.1 Herencia
Vehículo
-color: int
-numSerie: int
+color(): int
+numSerie(): int
+pinta(nuevoColor: int)
+cambiaNumSerie(nuevo: int)
Coche
-cilindrada: int
Barco
+cilindrada(): int
+cambiaCilindrada(nueva: int)
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
© M. Aldea y M. González
8/03/10
13
3.1 Herencia
Ejemplo: objetos y herencia
Vehículo v = new Vehículo();
Coche c = new Coche();
Barco b = new Barco()
c
:Coche
color: int
numSerie: int
cilindrada: int
color(): int
numSerie(): int
pinta(nuevoColor: int)
cambiaNumSerie(nuevo: int)
cilindrada(): int
cambiaCilindrada(nueva: int)
:Barco
color: int
numSerie: int
color(): int
numSerie(): int
pinta(nuevoColor: int)
cambiaNumSerie(nuevo: int)
heredados
añadidos
© M. Aldea y M. González
8/03/10
14
v
:Vehículo
color: int
numSerie: int
color(): int
numSerie(): int
pinta(nuevoColor: int)
cambiaNumSerie(nuevo: int)
b
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
Redefiniendo operaciones
Una subclase puede redefinir (“override”) una operación en lugar
de heredarla directamente
En muchas ocasiones (no siempre) la operación redefinida invoca
la de la superclase
3.1 Herencia
• se usa para ello la palabra super
• se refiere a la superclase del objeto actual
Invocación del constructor de la superclase:
super(parámetros...);
Invocación de un método de la superclase:
super.nombreMétodo(parametros...);
Prácticas de Programación
© M. Aldea y M. González
8/03/10
15
Tema 3. Herencia y Polimorfismo
Herencia y Constructores
Los constructores no se heredan
3.1 Herencia
• las subclases deben definir su propio constructor
Normalmente será necesario inicializar los atributos de la
superclase
• para ello se llama a su constructor desde el de la subclase
/** constructor de una subclase */
public Subclase(parámetros...) {
// invoca el constructor de la superclase
super(parámetros para la superclase);
// inicializa sus atributos
...
}
• la llamada a “super” debe ser la primera instrucción del
constructor de la subclase
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
© M. Aldea y M. González
8/03/10
16
3.1 Herencia
Herencia y Constructores (cont.)
Si desde un constructor de una subclase no se llama
expresamente al de la superclase
• el compilador añade la llamada al constructor sin parámetros
public Subclase(int i){
this.i=i;
}
se convierte en
public Subclase(int i){
super();
this.i=i;
}
• en el caso de que la superclase no tenga un constructor sin
parámetros se produciría un error de compilación
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
© M. Aldea y M. González
8/03/10
Ejemplo: constructores y redefinición de
operaciones
17
3.1 Herencia
Modificamos la clase Vehículo para añadir un constructor y un
método que retorna en un String los datos del objeto
Vehículo
-color: int
-numSerie: int
+Vehiculo(color: int,
numSerie: int)
+numSerie(): int
+color(): int
+pinta(nuevoColor: int)
+toString(): String
(En el capítulo 3.3 veremos porqué llamamos toString al método)
18
© M. Aldea y M. González
Prácticas de Programación
8/03/10
Tema 3. Herencia y Polimorfismo
3.1 Herencia
Ejemplo: clase Vehículo
public class Vehículo {
// constantes estáticas para los colores
public static final int rojo=1, verde=2, azul=3;
public static final String[] nombre=
{"error", "rojo", "verde", "azul"};
// atributos privados
private int color;
private int numSerie;
/**
* Constructor al que le pasamos el color
* y el número de serie
*/
public Vehículo(int color, int numSerie) {
this.color = color;
this.numSerie = numSerie;
}
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
© M. Aldea y M. González
8/03/10
19
3.1 Herencia
Ejemplo: clase Vehículo (cont.)
public int numSerie() {...}
public int color() {...}
No repetimos el código
(es igual que en el ejemplo anterior)
public void cambiaNumSerie(int numSerie) {...}
public void pinta(int nuevoColor) {...}
/**
* Obtener un texto con los datos
* del vehículo
*/
public String toString() {
return "Vehículo -> numSerie= "+
numSerie+", color= "+nombre[color];
}
}
Prácticas de Programación
Tema 3. Herencia y Polimorfismo
© M. Aldea y M. González
8/03/10
Ejemplo: Extensión al Coche
public class Coche extends Vehículo {
// cilindrada del coche
private int cilindrada;
20
3.1 Herencia
/**
* Constructor al que le pasamos el color, el
* numero de serie y la cilindrada
*/
public Coche(int color, int numSerie,
int cilindrada) {
super(color, numSerie);
this.cilindrada = cilindrada;
}
Prácticas de Programación
© M. Aldea y M. González
8/03/10
21
Tema 3. Herencia y Polimorfismo
3.1 Herencia
Ejemplo: Extensión al Coche (cont.)
/** Obtiene la cilindrada del coche */
public int cilindrada() {
return cilindrada;
}
/** Cambia la cilindrada del coche */
public void cambiaCilindrada(int nueva) {
cilindrada = nueva;
}
/** Retorna un texto con los datos del coche */
@Override
public String toString() {
r
Comentarios de: Prácticas de Programación - Tema 3. Herencia y Polimorfismo (0)
No hay comentarios