Seguimos con el ejemplo del archivo Uso_empleado, si recordamos creamos un Jefe
de RRHH que instanciamos primero y después lo insertamos en el array en la
posición 4. Luego creamos otro jefe pero creamos la instancia directamente en
el array en la posición 5.
Si queremos que a
la Jefa que ocupa la posición 5 del array queremos aplicarle el incentivo, si
hiciéramos esto:
No aparece el
método estableceIncentivo ya que el
array es de tipo Empleado. El array Empleado sí que me permite almacenar
empleados de tipo Jefe ya que Jefe siempre va a ser un empleado, pero lo que no
me va a permitir es almacenar un método que pertenece a la clase Jefe.
La alternativa a
esto sería aplicar una refundición o casting, es decir, convertir lo que hay dentro
de misEmpleado[5] que es de tipo Empleado a tipo Jefatura:
Jefatura jefe_finanzas = (Jefatura) misEmpleados[5];
Y ahora sí que nos
permite establecer el incentivo:
jefe_finanzas.estableceIncentivo(5000);
Si queremos
convertir el empleado que ocupa la posición 2 del array en un jefe:
misEmpleados[2]
= new
Empleado("Antonio Morales", 42000, 2002, 12, 22);
Nos tiene que dar
un error ya que no todos los empleados son Jefes:
Jefatura jefe_compras = (Jefatura) misEmpleados[2];
Si ejecutamos el
archivo:
Nos indica que la
clase Empleado no puede hacer casting a Jefatura.
Otros conceptos que
hay que tener en cuenta son las clases y métodos final. El que una clase sea final quiere decir que se rompe la
cadena de la herencia.
Si nos fijamos en
el archivo Uso_empleado, tenemos la clase Empleado y la clase Jefatura, la
clase Jefatura hereda de la clase Empleado, si creáramos una tercera clase, por
ejemplo, la clase Director que heredará de la clase Jefatura, pues la clase
Director sería la más funcional porque está heredando de Jefatura, que está
clase a su vez ha heredado de la clase Empleado. Vamos a crear la clase
Director:
class Director extends Jefatura {
public Director(String
nom, double sue, int agno, int mes, int dia) {
super(nom, sue, agno, mes, dia);
}
}
Hasta aquí todo
correcto. Pero si convertimos la clase Jefatura en final, veremos que se rompe la cadena de la herencia, todas las
clases que se creen por debajo de Jefatura no podrán heredar de la clase
Jefatura.
final class Jefatura extends Empleado {
Vemos el error:
Eliminamos la clase
Director y la palabra final en la clase Jefatura.
Vamos a ver cuándo
un método es de tipo final, quiere decir que este método no se puede heredar.
En la clase Empleado tenemos un método dameSue():
public double dameSue() {
return sueldo;
}
Que la clase
Jefatura sobrescribe, si este método lo convertimos en final de la clase
Empleado:
public final double dameSue() {
return sueldo;
}
Vemos el error de
este método de la clase Jefatura:
2.13 POLIMORFISMO << >> 2.15 CLASES ABSTRACTAS
No hay comentarios:
Publicar un comentario