El
concepto de Polimorfismo está
relacionado con el principio de sustitución.
El principio de
sustitución se refiere a que se puede utilizar un objeto de la subclase
siempre que el programa espere un objeto de la superclase.
O lo que es lo mismo:
un objeto se puede comportar de diferente forma dependiendo del contexto. Las
variables objeto son polimórficas.
En el ejemplo de la
clase Jefatura dependiendo del
contexto donde lo ejecutemos se comportara de una forma o de otra.
Si recordamos el método
main:
public static void main(String[] args) {
Empleado[]
misEmpleados = new Empleado[4];
misEmpleados[0] = new Empleado("Patricia
Martinez", 85000, 2000, 03, 03);
misEmpleados[1] = new Empleado("Paco
Rodriguez", 45000, 2001, 05, 07);
misEmpleados[2] = new Empleado("Antonio
Morales", 42000, 2002, 12, 22);
misEmpleados[3] = new Empleado("Rocio
Escarti");
for(Empleado e: misEmpleados) {
e.subeSueldo(5);
}
for(Empleado e: misEmpleados) {
System.out.println("Nombre:
"+e.dameNombre()+" Sueldo: "+e.dameSue()+
" Fecha
contrato: "+e.dameFechaAlta());
}
Creamos un array y
dentro de cada elemento del array instanciamos un objeto de la clase Empleado.
Vamos a crearnos una instancia de la clase Jefatura y la vamos a almacenar en
el array de misEmpleados:
Jefatura jefe_RRHH = new Jefatura("Carlos
Saez", 95000, 2000, 05, 05);
jefe_RRHH.estableceIncentivo(2550);
Ahora lo vamos a
incluir en el array, que es donde viene la novedad:
Empleado[] misEmpleados = new Empleado[5];
misEmpleados[0] = new Empleado("Patricia
Martinez", 85000, 2000, 03, 03);
misEmpleados[1] = new Empleado("Paco
Rodriguez", 45000, 2001, 05, 07);
misEmpleados[2] = new Empleado("Antonio
Morales", 42000, 2002, 12, 22);
misEmpleados[3] = new Empleado("Rocio
Escarti");
misEmpleados[4] = jefe_RRHH;
//Polimorfismo
Acabamos de
utilizar el concepto de Polimorfismo. ¿Qué
es lo que está esperando el elemento misEmpleados[4]? Espera que
almacenemos dentro de esa posición del array un objeto de tipo Empleado, sin
embargo, estamos almacenando un objeto de tipo Jefatura, por lo que estamos
empleando el principio de sustitución estamos utilizando un objeto de la
subclase siempre que el programa espere un objeto de la superclase.
Para ver el
polimorfismo de otra manera podemos añadir otro jefe directamente al array:
Jefatura
jefe_RRHH = new Jefatura("Carlos
Saez", 95000, 2000, 05, 05);
jefe_RRHH.estableceIncentivo(2550);
Empleado[]
misEmpleados = new Empleado[6];
misEmpleados[0] = new Empleado("Patricia
Martinez", 85000, 2000, 03, 03);
misEmpleados[1] = new Empleado("Paco
Rodriguez", 45000, 2001, 05, 07);
misEmpleados[2] = new Empleado("Antonio
Morales", 42000, 2002, 12, 22);
misEmpleados[3] = new Empleado("Rocio
Escarti");
misEmpleados[4] = jefe_RRHH; //Polimorfismo
misEmpleados[5] = new
Jefatura("Maria
Lopez", 102000,
2001, 03, 03);
Luego mediante un foreach subíamos el sueldo un 5% a
todos los empleados, también a los jefes porque son empleados. En el segundo foreach sale por consola la información
de cada empleado, su nombre, el sueldo con el aumento del 5% y la fecha de alta
de contratación, pero vamos a fijarnos en este foreach en el método dameSue():
Se supone que está
llamando al método de la clase Empleado, en la clase Jefatura lo
sobrescribimos, si ejecutamos:
Nos fijamos en el
penúltimo que es el Jefe de RRHH, Carlos Saez, le dimos un sueldo inicial de
95000:
Jefatura jefe_RRHH = new Jefatura("Carlos
Saez", 95000, 2000, 05, 05);
En el primer foreach se le ha aumentado el sueldo un
5%: 99.750.
En el segundo foreach al llamar al método dameSue() ¿cómo sabe Java que es el
método de la clase Jefatura y no el de la clase Empleado? Por el concepto de
enlazado dinámico. La máquina virtual detecta que este elemento pertenece a la
clase Jefatura porque le aplica el método dameSue()
de la clase Jefatura y no el de la clase Empleado.
2.12 HERENCIA << >> 2.14 REFUNDICIÓN DE OBJETOS (CASTING)
No hay comentarios:
Publicar un comentario