Al término de la unidad, ustedes aplicarán el concepto de herencia y polimorfismo, la relación de generalización/especialización entre clases, emplearán las técnicas de casting y clases abstractas en casos prácticos.
TEMARIO
· Técnicas de casting: Upcasting y Downcasting
· Polimorfismo y enlace dinámico
· Operador instanceof
· Ejercicios + Link
ACTIVIDADES PROPUESTAS
· Ustedes emplean el polimorfismo haciendo uso de las técnicas de casting, del operador instanceof y de clases abstractas.
1) Técnicas de Casting: Upcasting y Downcasting
Las técnicas de casting consiste en realizar conversiones de tipo, no modifican al objeto, sólo su tipo. Únicamente tienen sentido por la existencia de la herencia.
• Upcasting: Permite interpretar un objeto de una clase derivada como del mismo tipo que la clase base. También se puede ver como la conversión de un tipo en otro superior en la jerarquia de clases. No hace falta especificarlo.
• Downcasting: Permite interpretar un objeto de una clase base como del mismo tipo que su clase derivada. También se puede ver como la conversión de un tipo en otro inferior en la jerarquia de clases. Se especifica precediendo al objeto a convertir con el nuevo tipo entre paréntesis.
Ejemplo 1:
Clase Animal
package semana14; public class Animal { public String hacerRuido(){ return "no definido"; } }
Clase Mamifero
package semana14; public class Mamifero extends Animal{ public String mensaje(){ return "soy mamífero"; } }
Clase Perro
package semana14; public class Perro extends Mamifero{ public String mensaje(){ return "Soy perro"; } public String hacerRuido(){ return "Guau"; } }
Clase Principal
Aplicando Upcasting:
void procesar(){ Mamifero m1 = new Perro(); imprimir(m1.mensaje()); imprimir(m1.hacerRuido()); }
Se está creando un objeto de tipo Perro. Pero, m1 es de tipo Mamífero (clase superior en la jerarquía de clases del ejemplo). Los métodos mensaje() y hacerRuido() deben existir en la clase Mamifero o se deben heredar de una clase superior (clase Animal) para que compile. Como el objeto es un Perro y los métodos mensaje() y hacerRuido() se están sobre-escribiendo en la clase Perro, la salida es:
Soy perro
Guau
Pero, si en la clase Perro no se hubierá sobre-escrito el método mensaje(), la salida hubierá sido:
soy mamífero
Guau
Y si no se hubierá sobre-escrito ni el método mensaje() ni el método hacerRuido(), la salida hubierá sido:
soy mamífero
no definido
Al ejecutar un método, se busca su implementación de abajo hacia arriba en la jerarquía de clases. Los casting no modifican al objeto. Sólo su tipo, por lo que se siguen ejecutando sobre el mismo objeto.
Aplicando Downcasting
void procesar(){ Animal a = new Perro(); Perro p = (Perro)a; imprimir(p.hacerRuido()); }
Se está creando un objeto de tipo Perro que se almacena en la variable de referencia a de tipo Animal (clase superior en la jerarquía de clases del ejemplo). Luego, la referencia a se convierte a tipo Perro y através de p se accesa al objeto. Se entenderá su aplicación con el ejemplo completo de polimorfismo que se verá en las siguientes páginas.
El siguiente ejemplo, compila pero no funciona porque a1 hace referencia a un objeto de tipo Animal. No se puede convertir un animal a perro.
void procesar(){ Animal a1 = new Animal(); Perro p1 = (Perro)a1; //ERROR imprimir(p1.hacerRuido()); }
2) Polimorfismo y enlace dinámico
El polimorfismo está presente cuando se realiza la llamada a un método de un objeto del que no se sabe su tipo hasta que el programa esté en ejecución. Al tener métodos sobre-escritos, objetos de diferentes tipos pueden responder de forma diferente a la misma llamada, de tal forma que podemos escribir código de forma general sin preocuparnos del método concreto que se ejecutará en cada momento.
El enlace dinámico se da cuando se elige el método a ejecutar en tiempo de ejecución, en función de la clase del objeto; es la implementación del polimorfismo.
Un método es polimórfico cuando actúa de diferentes formas dependiendo del objeto que reciba. En el ejemplo que se muestra a continuación, el método listar de la clase Principal es un método polimórfico, ya que, cuando es llamado por primera vez, lista el comportamiento de un Gato y, la segunda vez, lista el comportamiento de un Perro.
Ejemplo 2:
Clase Mamífero
package padre; public abstract class Mamifero { public abstract String hacerRuido(); public String mensaje(){ return "soy mamífero"; } }
Clase Perro
package hijo; import padre.Mamifero; public class Perro extends Mamifero{ public String hacerRuido(){ return "Guau"; } }
Clase Gato
package hijo; import padre.Mamifero; public class Gato extends Mamifero{ public String hacerRuido(){ return "Miau"; } public String mensaje(){ return "soy gato"; } }
Clase Principal
import padre.Mamifero; import hijo.*; ... ... void procesar(){ Gato g = new Gato(); listar(g); Perro p = new Perro(); listar(p); } // listar es un método polifórmico void listar( Mamifero x ){ imprimir(x.hacerRuido()); imprimir(x.mensaje()); }
Salida:
Miau
soy gato
Guau
soy mamífero
Importante:
El polimorfismo se da en el método listar, ya que la variable de referencia x va a recibir un objeto de diferente tipo cada vez que se llame al método listar y la ejecución de los métodos hacerRuido() y mensaje() se van a comportar dependiendo del objeto al cual está referenciando x.
3) Operador instanceof
Se utiliza el operador instanceof para determinar si el objeto es de la clase esperada antes de realizar el casting.
Ejemplo 3:
Implemente la clase abstracta Persona en el paquete semana14 con los siguientes miembros:
- Atributos protegidos: apellidos, nombres y edad
- Constructor que inicializa los atributos de la clase
- Un método abstracto: mostrarDatos() para mostrar los datos de la persona creada
- Un método generarCorreo() que retorna el correo formado por el primer carácter del nombre, el primer caracter del apellido, la edad y al final “@aprendec.com”.
Luego, implemente dos subclases de Persona: Docente y Alumno en el paquete semana14.
Docente presenta los siguientes miembros:
- Atributos privados: horas que dicta por semana y tarifa
- Constructor con parámetros para inicializar los atributos: apellidos, nombres, edad, horas y tarifa
- Redefina o sobrescriba el método mostrarDatos()
- Método calcularSueldo() que retorna horasXtarifa
Alumno presenta los siguientes miembros:
- Atributos privados: tres notas de tipo double.
- Constructor con parámetros para inicializar los atributos: apellidos, nombres, edad y las tres notas
- Redefina o sobrescriba el método mostrarDatos()
- Método calcularPromedio() que retorna el promedio simple de las tres notas.
Por último, implemente el método Procesar de la clase Principal que contiene el actionPerformed() para crear los objetos de Docente y Alumno e invoque al método listar para mostrar los datos de los objetos creados.
Clase Persona
package semana14; public abstract class Persona { protected String apellido,nombre; protected int edad; public Persona(String ape, String nom, int ed) { apellido=ape; nombre=nom; edad=ed; } public abstract String mostrarDatos(); public String generarCorreo(){ return ""+nombre.charAt(0)+apellido.charAt(0)+edad+"@aprendec.com"; } }
Clase Docente
package semana14; public class Docente extends Persona{ private double horas,tarifa; public Docente(String ape, String nom, int ed, double h, double t) { super(ape,nom,ed); horas=h; tarifa=t; } public double calcularSueldo(){ return horas*tarifa; } public String mostrarDatos(){ return "Apellido: "+apellido+"\n"+ "Nombre: "+nombre+"\n"+ "Edad: "+edad+"\n"+ "Horas: "+horas+"\n"+ "Tarifa: "+tarifa+"\n"; } }
Clase Alumno
package semana14; public class Alumno extends Persona{ private double nota1,nota2,nota3; public Alumno(String ape, String nom, int ed, double n1, double n2, double n3) { super(ape,nom,ed); nota1=n1; nota2=n2; nota3=n3; } public double calcularPromedio(){ return (nota1+nota2+nota3)/3; } public String mostrarDatos(){ return "Apellido: "+apellido+"\n"+ "Nombre: "+nombre+"\n"+ "Edad: "+edad+"\n"+ "Nota1: "+nota1+"\n"+ "Nota2: "+nota2+"\n"+ "Nota3: "+nota3+"\n"; } }
Clase Principal
import semana14.*; ... ... void procesar(){ Docente obj1=new Docente("Gálvez","Ricardo",35,100,40); listar(obj1); Alumno obj2=new Alumno("Salazar","Sandra",20,14,16,13); listar(obj2); } // listar es un método polifórmico void listar(Persona x){ imprimir("Datos: \n"+x.mostrarDatos()); imprimir("su correo es:"+x.generarCorreo()); if(x instanceof Docente) imprimir("Sueldo:"+((Docente)x).calcularSueldo()+"\n"); else imprimir("Promedio:"+((Alumno)x).calcularPromedio()+"\n"); }
Descargar ejercicios
Preguntas
¿En que consisten las técnicas de casting y cuales son sus tipos?
¿Qué es el polimorfismo y el enlace dinámico?
¿Qué es un método polimórfico?
¿Para qué se utiliza el operador instanceof?
No hay comentarios, ¡cuéntame algo!
Me gustaría saber tu opinión. ¡Saludos!