Hola a todos, hoy os voy a explicar como podemos hacer casting de objetos.
Ya vimos el tema del casting entre tipos primitivos, en objetos tambien podemos hacer castings.
Igual que en el de tipos, los objetos deben ser compatibles entre sí, por ejemplo una clase hija y una clase padre.
La mayor utilidad de los castings de objetos es cuando necesitamos que sea de un objeto en concreto, ya que si es del tipo de la clase padre, no podrá llamar a los métodos propios de la clase hija.
Veamos nuestras clases:
Empleado
public class Empleado { protected String nombre; protected String apellido; protected int edad; protected double salario; public Empleado(String nombre, String apellido, int edad, double salario) { this.nombre = nombre; this.apellido = apellido; this.edad = edad; this.salario = salario; } public Empleado(String nombre, String apellido, int edad) { this.nombre = nombre; this.apellido = apellido; this.edad = edad; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getApellido() { return apellido; } public void setApellido(String apellido) { this.apellido = apellido; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } public double getSalario() { return salario; } public void setSalario(double salario) { this.salario = salario; } @Override public String toString() { return "Empleado{" + "nombre=" + nombre + ", apellido=" + apellido + ", edad=" + edad + ", salario=" + salario + '}'; } public boolean plus(double plus) { boolean aumento = false; if (edad > 40) { salario += plus; aumento = true; } return aumento; } }
Comercial
public class Comercial extends Empleado{ private double comision; public Comercial(String nombre, String apellido, int edad, double salario, double comision) { super(nombre, apellido, edad, salario); this.comision=comision; } @Override public boolean plus(double plus) { boolean aumento = false; if (edad > 40 && comision>200) { salario += plus; aumento = true; } return aumento; } public void metodoComercial(){ System.out.println("Estoy en la clase comercial"); } }
Repartidor
public class Repartidor extends Empleado { private String zona; public Repartidor(String nombre, String apellido, int edad, double salario, String zona) { super(nombre, apellido, edad, salario); this.zona = zona; } @Override public boolean plus(double plus) { boolean aumento = false; if (edad > 40 && zona.equals("zona 3")) { salario += plus; aumento = true; } return aumento; } public void metodoRepartidor(){ System.out.println("Estoy en la clase repartidor"); } }
Clase ejecutable
public class Casting_objetos { public static void main(String[] args) { Comercial e1 = new Comercial("fer", "ure", 60, 1000, 150); Repartidor e2 = new Repartidor("fer", "ure", 50, 1000, "zona 3"); Empleado e3 = new Empleado("fer", "ure", 42, 1000); Empleado[] empleados = {e1, e2, e3}; Comercial c1; Repartidor r1; for (Empleado e : empleados) { if(e instanceof Comercial){ c1 = (Comercial)e; c1.metodoComercial(); } if(e instanceof Repartidor){ r1 = (Repartidor)e; r1.metodoRepartidor(); } } } }
Fijaros en las clases Repartidor y Comercial, les he puesto un método que es único en cada uno. Bien, ahora mira en la clase ejecutable y fijate que meto 3 objetos en un array Empleado, cada uno de ellos ahora estan enmascarados como si fuera un Empleado por lo que no podran llamar a ese método único.
Dentro del bucle, uso instanceof para asegurme que el objeto sea del tipo que yo quiero castear. Si lo es puedo hacer el casting sin problemas:
//Nos aseguramos de que sea del tipo Comercial if(e instanceof Comercial){ c1 = (Comercial)e; //Casting a comercial c1.metodoComercial(); //Ahora puedo llamar al metodo }
Como resumen, los casting son útiles cuando queremos llamar a métodos propios de un objeto que esta en otra clase compatible. Por último, te recomiendo utilizar polimorfismo para evitar en todo lo posible el casting, siempre que se pueda.
Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.
Un par de errores, me parece a mi, por el copiar y pegar. Los caracteres ‘>’: mayor e igual’ e ‘&’: amperstand. En html estos aparecen como > y &
Tal cual lo que pensé, html hizo la traducción de lo que escribí….
Está bien el ejemplo, se podría mejorar la didáctica con un digrama de clases para ver gráficamente las relaciones de herencia y asociación.
Tengo problemas con este codigo, alguien me puede ayudar?
/**
* Ejercicio 1
*
* Completar este programa que muestra el número de ocurrencias de cada caracter en una cadena
* programando el método contadorLetras y aquellos otros que se consideren necesarios.
*
* Solo se trabaja con las minúsculas (a-z) sin incluir la ñ.
*
*/
public class Ejercicio1 {
////////////////// INCLUIR AQUÍ EL CÓDIGO NECESARIO ////////////
/**
* Programa principal
*
* ¡¡¡ No modificar este método !!!
*
* @param args
*/
public static void main(String[] args) {
String cadena = «al alba, al alba»;
System.out.println(«La cadena \»» + cadena + «\» tiene los siguientes caracteres:»);
int[] ocurrencias = contadorLetras(cadena);
for (char c = ‘a’; c <= 'z'; c++) {
System.out.println(c + " : " + ocurrencias[c - 'a'] + " ocurrencias");
}
}
}