8. Herencia y Polimorfismo

Parte I: Programación en un lenguaje
orientado a objetos
1. Introducción a los lenguajes de programación
2. Datos y expresiones
3. Estructuras algorítmicas
4. Datos compuestos
5. Modularidad
6. Tratamiento de errores
7. Entrada/salida con ficheros
8. Herencia y Polimorfismo
• Herencia. Clases Abstractas. Polimorfismo.
www.istr.unican.es
© Michael González Harbour, 18/ma/15
1
UNIVERSIDAD
DE CANTABRIA
Jerarquía de clases
Uno de los mecanismos de la programación orientada a objetos es
poder crear clases a partir de otras, por extensión
• Cuando la nueva clase se parece a la anterior se programan solo las
extensiones, sin repetir lo común
- programación por extensión
Esto da lugar a una jerarquía:
• clase padre o superclase
• clases hijas o subclases
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
2
Herencia
Ejemplo de relación de herencia:
• todos los coches son vehículos
• pero no al revés
La herencia :mecanismo para crear nuevas
clases a partir de otras existentes,
• heredando, y posiblemente redefiniendo,
y/o añadiendo operaciones
• heredando y posiblemente añadiendo
atributos
Vehiculo
Coche
superclase
(padre)
Barco
subclases
(hijo)
El mecanismo de herencia no suprime abributos ni operaciones
www.istr.unican.es
© Michael González Harbour, 18/ma/15
3
UNIVERSIDAD
DE CANTABRIA
Herencia de operaciones
Al extender una clase
• 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 redefinida 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
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
4
Herencia en un diagrama de clases
Figura
-color
+dibuja()
+borra()
+cambiaColor()
superclase
Línea
Círculo
-puntoInicio
-puntoFin
+dibuja()
+borra()
-centro
-radio
subclases
+dibuja()
+borra()
+rellena()
• Los atributos y métodos de la superclase no se repiten en las
subclases, salvo que se hayan redefinido
- por ejemplo, FDPELD&RORU se hereda sin cambios
- UHOOHQD es una operación nueva
www.istr.unican.es
© Michael González Harbour, 18/ma/15
5
UNIVERSIDAD
DE CANTABRIA
Herencia y Constructores
Los constructores no se heredan
• 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
FRQVWUXFWRUGHXQDVXEFODVH
public6XEFODVHSDU£PHWURV^
LQYRFDHOFRQVWUXFWRUGHODVXSHUFODVH
superSDU£PHWURVSDUDODVXSHUFODVH
LQLFLDOL]DVXVSURSLRVDWULEXWRV
`
• la llamada a “VXSHU” debe ser la primera instrucción del constructor
de la subclase
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
6
Ejemplo
Clase que representa un vehículo cualquiera
Vehiculo
-Color color
-int numSerie
-static int ultimoNumSerie
+Vehiculo(Color c)
+Color color()
+int numSerie()
+pinta (Color nuevoColor)
www.istr.unican.es
© Michael González Harbour, 18/ma/15
7
UNIVERSIDAD
DE CANTABRIA
Ejemplo: clase Vehiculo
&ODVHTXHUHSUHVHQWDXQYHK¯FXORFXDOTXLHUD
public class9HKLFXOR
^
FRORUHVGHORVTXHVHSXHGHSLQWDUXQYHK¯FXOR
public static enum&RORU^52-29(5'($=8/`
DWULEXWRV
private&RORUFRORU
private finalLQWQXP6HULH
DWULEXWRHVW£WLFRSDUDREWHQHUHOQ¼PGHVHULH
private staticLQWXOWLPR1XP6HULH www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
8
clase Vehiculo (cont.)
&RQVWUX\HXQYHK¯FXOR
#SDUDPFFRORUGHOYHK¯FXOR
public9HKLFXOR&RORUF
^
thisFRORU F
REWHQHUXQQXHYRQ¼PHURGHVHULH
XOWLPR1XP6HULH
thisQXP6HULH XOWLPR1XP6HULH
`
www.istr.unican.es
© Michael González Harbour, 18/ma/15
9
UNIVERSIDAD
DE CANTABRIA
clase Vehiculo (cont.)
5HWRUQDHOFRORUGHOYHK¯FXOR
#UHWXUQFRORUGHOYHK¯FXOR
public&RORUFRORU
^
returnFRORU
`
5HWRUQDHOQXPHURGHVHULHGHOYHK¯FXOR
#UHWXUQQXPHURGHVHULHGHOYHK¯FXOR
publicLQWQXP6HULH
^
returnQXP6HULH
`
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
10
clase Vehiculo (cont.)
`
3LQWDHOYHK¯FXORGHXQFRORU
#SDUDPQXHYR&RORUFRORUFRQHOTXHSLQWDU
HOYHK¯FXOR
public YRLGSLQWD&RORUQXHYR&RORU
^
FRORU QXHYR&RORU
`
www.istr.unican.es
© Michael González Harbour, 18/ma/15
11
UNIVERSIDAD
DE CANTABRIA
Ejemplo: extensión a la clase Coche
Vehiculo
&RORUFRORU
LQWQXP6HULH
9HKLFXOR&RORUF
&RORUFRORU
LQWQXP6HULH
SLQWD&RORUQXHYR&RORU
Coche
LQWFLOLQGUDGD
&RFKH&RORUFLQWFLOLQGUDGD
LQWFLOLQGUDGD
FDPELD&LOLQGUDGDLQWFLOLQ
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
12
Extensión a la clase Coche (cont.)
&ODVHTXHUHSUHVHQWDXQFRFKH
public class&RFKHextends9HKLFXOR^
// cilindrada del coche
privateLQWFLOLQGUDGD
&RQVWUXFWRUDOTXHOHSDVDPRVHOFRORU
\ODFLOLQGUDGD
public&RFKH&RORUFLQWFLOLQGUDGD
^
superF
thisFLOLQGUDGD FLOLQGUDGD
`
www.istr.unican.es
© Michael González Harbour, 18/ma/15
13
UNIVERSIDAD
DE CANTABRIA
Extensión a la clase Coche (cont.)
/** Obtiene la cilindrada del coche */
publicLQWFLOLQGUDGD^
returnFLOLQGUDGD
`
/** Cambia la cilindrada del coche */
publicYRLGFDPELD&LOLQGUDGDLQWFLOLQ^
thisFLOLQGUDGD FLOLQ
`
6HKHUHGDQORVP«WRGRV
FRORUQXP6HULH\SLQWD
`
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
14
Ejemplo: extensión a la clase Barco
Se puede hacer herencia sin añadir métodos y/o atributos
public class%DUFRextends9HKLFXOR
^
&RQVWUXFWRUDOTXHOHSDVDPRVHOFRORU
public%DUFR&RORU F^
superF
`
`
www.istr.unican.es
© Michael González Harbour, 18/ma/15
15
UNIVERSIDAD
DE CANTABRIA
Redefiniendo operaciones
Una subclase puede redefinir (“override”) una operación en lugar de
heredarla directamente
• es conveniente indicarlo poniendo #RYHUULGH justo antes del
método
En muchas ocasiones (no siempre) la operación redefinida invoca la de
la superclase
• se usa para ello la palabra VXSHU
• se refiere a la superclase directa del objeto actual
Invocación de un método de la superclase:
superQRPEUH0«WRGRSDUDPHWURV
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
16
Ejemplo: nueva operación en la clase
Vehiculo
public class9HKLFXOR^
2EWHQHUXQWH[WRFRQORVGDWRV
GHOYHK¯FXOR
public6WULQJWR6WULQJ
^
return9HKLFXOR!QXP6HULH QXP6HULH
FRORU FRORU
`
`
www.istr.unican.es
© Michael González Harbour, 18/ma/15
17
UNIVERSIDAD
DE CANTABRIA
Ejemplo: redefinir la nueva operación en
la clase Coche
public class&RFKH^
2EWHQHUXQWH[WRFRQORVGDWRVGHOFRFKH
LQFOX\HQGRODFLOLQGUDGD
#2YHUULGH
public6WULQJWR6WULQJ
^
returnsuperD7H[WRFLOLQGUDGD FLOLQGUDGD
`
`
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
18
Resumen Herencia
Las clases se pueden extender
• la subclase hereda los atributos y métodos de la superclase
- aunque la parte privada de la superclase no es accesible desde las
subclases (la parte SURWHFWHG, sí)
A la subclase se le pueden añadir nuevas operaciones y atributos
Al extender una clase se pueden redefinir sus operaciones
• si se desea, se puede invocar desde la nueva operación a la de la
superclase: programación incremental
Buena práctica de programación:
• utilizar #2YHUULGH en los métodos redefinidos
www.istr.unican.es
© Michael González Harbour, 18/ma/15
19
UNIVERSIDAD
DE CANTABRIA
Clases abstractas
En ocasiones definimos clases de las que no pretendemos crear objetos
• su único objetivo es que sirvan de superclases a las clases “reales”
Ejemplos:
• nunca crearemos objetos de la clase )LJXUD
- lo haremos de sus subclases &¯UFXOR, &XDGUDGR, ...
• nunca crearemos un 9HKLFXOR
- crearemos un &RFKH, un %DUFR, un $YLµQ, ...
A ese tipo de clases las denominaremos clases abstractas
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
20
Clases abstractas en Java
Las clases abstractas en Java se identifican mediante la palabra
reservada DEVWUDFW
public abstract class)LJXUD^
`
Es un error tratar de crear un objeto de una clase abstracta
)LJXUDI new)LJXUD
ERROR detectado por el compilador
Pero NO es un error utilizar referencias a clases abstractas
)LJXUDI new&¯UFXOR// correcto
)LJXUDI new&XDGUDGR // correcto
www.istr.unican.es
© Michael González Harbour, 18/ma/15
21
UNIVERSIDAD
DE CANTABRIA
Métodos abstractos
Una clase abstracta puede tener métodos abstractos
• se trata de métodos sin cuerpo
• que es obligatorio redefinir en las subclases no abstractas
• ejemplo de método abstracto
public abstractYRLGGLEXMD
no tiene instrucciones
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
22
Ejemplo: clase abstracta Figura y
subclases
Figura
Elementos abstractos
en cursiva
-color
+cambiaColor
+borra
+dibuja
Figura1D
Figura2D
-ptoIni
-ptoFin
-colorRelleno
+cambiaRelleno
Recta
+borra
+dibuja
www.istr.unican.es
Curva
-radio
+borra
+dibuja
Círculo
-ptoCentro
-radio
Cuadrado
-ptoSupIzq
-ptoInfDer
+borra
+dibuja
+borra
+dibuja
© Michael González Harbour, 18/ma/15
23
UNIVERSIDAD
DE CANTABRIA
Polimorfismo
Las operaciones polimórficas son aquellas que hacen funciones
similares con objetos diferentes de la misma jerarquía
Ejemplo: suponer que existe la clase )LJXUD y sus subclases
- &¯UFXOR
&XDGUDGR
3RO¯JRQR
Figura
+dibuja()
+borra()
Todas ellas con las operaciones:
- GLEXMD()
- ERUUD()
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
Círculo
Cuadrado
Polígono
+dibuja()
+borra()
+dibuja()
+borra()
+dibuja()
+borra()
© Michael González Harbour, 18/ma/15
24
Polimorfismo (cont.)
Nos gustaría poder hacer la operación polimórfica PXHYH)LJXUD
que opere correctamente con cualquier clase de figura:
PXHYH)LJXUD
ERUUD
GLEXMDHQODQXHYDSRVLFLµQ
Esta operación polimórfica debería:
• llamar a la operación ERUUD del &¯UFXOR cuando la figura sea un
círculo
• llamar a la operación ERUUD del &XDGUDGR cuando la figura sea un
cuadrado
• etc.
www.istr.unican.es
© Michael González Harbour, 18/ma/15
25
UNIVERSIDAD
DE CANTABRIA
Polimorfismo en Java
El polimorfismo en Java se basa en dos propiedades:
1. Una referencia a una superclase puede apuntar a un objeto de cualquiera de sus subclases
9HKLFXORY new&RFKH9HKLFXORURMR
9HKLFXORY new%DUFR9HKLFXORD]XO
2. La operación se selecciona en base a la clase del objeto, no a la de
la referencia
YD7H[WR
usa el método de la clase &RFKH, puesto que Y es un coche
YD7H[WR
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
usa el método de la clase %DUFR, puesto que Y es un barco
© Michael González Harbour, 18/ma/15
26
Polimorfismo en Java
Gracias a esas dos propiedades, el método PRYHU)LJXUD sería:
publicYRLGPXHYH)LJXUD)LJXUDI3RVLFLµQSRV^
IERUUD
IGLEXMDSRV
`
Y podría invocarse de la forma siguiente:
&¯UFXORF new&¯UFXOR
3RO¯JRQRS new3RO¯JRQR
SRV PXHYH)LJXUDFSRV
PXHYH)LJXUDSSRV
www.istr.unican.es
© Michael González Harbour, 18/ma/15
27
UNIVERSIDAD
DE CANTABRIA
Polimorfismo en Java (cont.)
• Gracias a la primera propiedad el parámetro I puede referirse a
cualquier subclase de )LJXUD
• Gracias a la segunda propiedad en PXHYH)LJXUD se llama a las
operaciones ERUUD y GLEXMD apropiadas
El lenguaje permite que una referencia a una superclase pueda apuntar
a un objeto de cualquiera de sus subclases
• pero no al revés
9HKLFXORY new&RFKH// permitido
&RFKHF new%DUFR// ¡NO permitido!
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
28
Conversión de referencias (casting)
Es posible convertir referencias
9HKLFXORY new&RFKH
&RFKHF &RFKHY
YFLOLQGUDGD// ¡ERROR!
FFLOLQGUDGD// correcto
El casting cambia el “punto de vista” con el que vemos al objeto
• a través de Y le vemos como un 9HKLFXOR
- y por tanto sólo podemos invocar métodos de esa clase
• a través de F le vemos como un &RFKH
- y podemos invocar cualquiera de los métodos de esa clase
• el objeto siempre es el mismo
- tenemos un solo objeto coche, que a su vez es un solo vehículo
www.istr.unican.es
© Michael González Harbour, 18/ma/15
29
UNIVERSIDAD
DE CANTABRIA
Resumen
El polimorfismo nos permite abstraer operaciones
• podemos invocarlas sin preocuparnos de las diferencias existentes
para objetos diferentes
• el sistema elige la operación apropiada al objeto
El polimorfismo se asocia a las jerarquías de clases:
• una superclase y todas las subclases derivadas de ella
El polimorfismo en Java se basa en dos propiedades:
• Una referencia a una superclase puede apuntar a un objeto de
cualquiera de sus subclases
• La operación se selecciona en base a la clase del objeto, no a la de la
referencia
www.istr.unican.es
UNIVERSIDAD
DE CANTABRIA
© Michael González Harbour, 18/ma/15
30