2.14 REFUNDICIÓN DE OBJETOS (CASTING)

 

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