Implementación de polimorfismo
◦
Variables polimórficas
◦
Ligadura dinámica
Final
◦
Variables
◦
Métodos
◦
Clases
Realización de Interfaces
Describir a un
Caballo como que es un Transporte no es
sólo una manera conveniente de describir la relación
entre estas dos clases; sino que significa que cualquier
operación legítima en un Transporte es también
legítima en un Caballo.
Un objeto tiene solo una forma (aquella que le fue dada en su
constructor); sin embargo, una
variable puede ser
polimórfica
, porque ésta
puede referirse a objetos de
diferentes tipos
.
◦
Transporte t = new Caballo();
◦
Transporte t = new Cohete();
◦
Transporte t = new Carro();
Solo puede acceder a las partes del objeto
Transporte
Las partes específicas del objeto son ocultos
Declarando objetos caballo de tipo
transporte y tipo caballo.
◦
Transporte t= new Caballo();
◦
Caballo c = new Caballo();
◦
t.avanzar();
◦
c.avanzar()
.5
Comportamientos
diferente
El polimorfismo esta presente
cuando se envía un mensaje
a un objeto del que no se
sabe su tipo, ejecutándose el
método adecuado de acuerdo
con su tipo.
Ligadura dinámica: 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.
.7
Figura f1 =
new
Figura(“Estandar”, “Rojo”);
Figura f2 =
new
Circulo(“Verde”, 5.0);
Pero qué pasa si hacemos:
◦
Transporte t = new Caballo();
◦
t.avanzar();
Obtenemos el comportamiento asociado
con el objeto actual al cual se refiere la
variable en tiempo de ejecución.
Este comportamiento es un aspecto de
polimorfismo y es llamado frecuentemente
método virtual de invocación o ligadura
La solución consiste en esperar a resolver la
llamada en tiempo de ejecución, cuando se
conoce realmente el objeto conectado a r, y
por lo tanto cuál es la versión de f()
apropiada.
La ligadura dinámica también se aplica
En equipos, resuelvan el siguiente problema:
La empresa TKE ofrece como parte de las prestaciones a sus
empleados diferentes préstamos: para auto, casa y efectivo. La información que se almacena para cada préstamo es el nombre del deudor, su número de empleado, años laborados, el monto prestado, la suma mensual a pagar y los intereses mensuales. Para un préstamo para casa, el interés es del 3% mensual fijo a un máximo de 20 años. Para un préstamo para Auto, es del 20% si tiene menos de 10 años laborados y del 15% si tiene mas de 10 . Los préstamos de efectivo son a 12 meses sin intereses si tiene mas de 20 años laborando, en caso contrario se cobra un interés anual del 30%
El administrador de TKE quiere conocer los ingresos totales
mensuales, que la empresa recibirá por concepto de pagos, sin importar el tipo de préstamo. Además requiere conocer la información detallada de cada préstamo.
Analiza el problema de la Empresa TKE, diseña una solución e
implementa un programa sencillo en Java (propón una solución que aplique polimorfismo).
En el rancho la "Esperanza", se cuenta con diferentes
graneros para almacenar semillas (maíz, trigo, sorgo,
etc.). Los graneros tienen diferentes formas y
tamaños, algunos son cilíndricos, otros cúbicos y
otros cónicos. Conocer el volumen de semillas
almacenadas es vital para la subsistencia de la región
en tiempos de sequías; por lo que se requiere calcular
constantemente la cantidad total de semillas
almacenadas en los graneros, sin importar el tipo de
semilla, para evitar desabasto. Además, visualizar el
tipo de semilla que está almacenada en cada
granero.
Una librería, vende diferentes publicaciones como revistas
y libros. Todas las publicaciones tienen una editorial y una
fecha de publicación; sin embargo, cada tipo de publicación
tiene información adicional requerida, por ejemplo, las
revistas tienen nombre, el número de ejemplares que se
pone en circulación y la periodicidad con que salen:
semanal, mensual, anual, etc. Los libros, a diferencia,
tienen un código ISBN, el nombre del autor y el titulo del
libro. El dueño de la librería, esta interesado en contar con
un programa que le permita ver el catalogo completo de
sus publicaciones y el catálogo por editorial.
Supongamos que Perro hereda de Animal y
que a la clase Perro, le agregamos el
método moverCola ( )
public String moverCola ( ) {
return “ moviendo cola “;
}
Entonces podemos escribir
Animal x = new Perro( );
String texto = x.moverCola( );
---Configuration:
<Default>---D:\Progra2\u4\Programas\EjemplosRelaciones\Polimorfismo\
EjPolimorfismo.java:25: cannot find symbol
symbol : method mueveCola()
location: class Animal
String texto=x.mueveCola();
^
¿Qué pasa si tratamos de asignar un objeto de una clase
a una variable de otra clase?
Por ejemplo
Circulo c1 = new Circulo( );
Figura x = c1;
◦
Puesto que estas variables están relacionadas en una
jerarquía de clases, esta asignación desplaza al objeto
circulo hacia arriba en la jerarquía, a un concepto más
general.
Las reglas para asignar objetos:
◦
No se puede desplazar algo a través del mismo nivel de
la jerarquía de clases
◦
Si se puede desplazar algo
hacia arriba
del árbol
sin
problemas
◦
Si se puede desplazar algo
hacia debajo
de la
jerarquía, pero hay que
ser explícitos
y utilizar lo que
se llama especificación
Moldear significa cambiar explícitamente el tipo
de la variable en la que se guarda la referencia a
un objeto
◦
No que un objeto de superclase se convierta en
uno de su subclase
El operador de casting es el tipo destino
escrito entre paréntesis
Ej: Figura x;
Circulo c1 = (Circulo) x;
Un objeto (una vez creado) retiene su identidad
También podemos utilizar el operador
instanceof
para comprobar si hacer un determinado casting es
válido y evitar que se cree un error en tiempo de
ejecución (ClassCastException) y el programa
termine
Ejemplo:
If(x
instanceof
Serpiente) {
Serpiente sid= (
Serpiente
) x;
String texto = sid.mudarPiel( );
}
En el ejemplo se comprueba que efectivamente el
Supongamos que tenemos un método de la
clase Zoológico, definido de la siguiente
forma:
void agregarAnimal(Animal a
){
…
}
Se dice que a es un argumento
Por ejemplo, desde el cliente se podría tener:
…main(…) {
Zoologico africam = new Zoologico();
Elefante dumbo = new Elefante();
africam.agregarAnimal(dumbo);
africam.agregarAnimal(
new Elefante());
africam.agregarAnimal(new Tigre());
africam.agregarAnimal(new Leon());
}
Y el nombre del segundo elefante ? Es
En equipos, implementen en Java su diagrama de clases que da
solución al siguiente problema
La escuela Avanza cuenta con varios tipos de empleados: profesores
y contador. Todos los empleados tienen en común la información siguiente: No. empleado (ID), Nombre completo y sueldo. Sin
embargo, dependiendo del tipo de empleado se calcula su sueldo de la siguiente forma:
Contador: Cuenta con un sueldo fijo mensual más un bono del 1%
de su sueldo por los años laborados. Es decir, un bono por su antigüedad.
Profesor Tiempo completo: Su sueldo es fijo mensual + un bono
adicional de apoyo a materiales
Profesor Hora clase: Su sueldo es en base a las horas laboradas y se
le paga a razón de 150 x hora.
Dentro de los empleados, el contador es el único que puede generar
En algunos casos, se puede necesitar que
un método de una superclase permanezca
invariante (
constante
) a lo largo de la
jerarquía de clases, esto es, que ninguna
subclase pueda sobreescribirlo.
En este caso, podemos declarar que el
public abstract class Figura {
abstract public double area();
public Figura (String n) { nombre = n;}
final public boolean menorQue(Figura
lder)
{ return area() < lder.area(); }
final public String toString()
{ return nombre + “con area “ + area( ); }
private String nombre;
Cuando defines una variable final, estas definiendo una
entidad una sola vez y una vez inicializada, no puede
cambiar de valor en algún otro lugar.
Para declarar una variable como final se realiza lo siguiente:
public final double nDatos= 100;
Normalmente las variables final son declaradas static
también, lo que hace que sea “constantes” a nivel de clase.
Una clase final no puede ser extendida. Como
consecuencia, todos sus métodos son
automáticamente métodos finales.
Nótese que el hecho de que una clase tenga
métodos finales no implica que la clase sea
también final,
como pasa con las clases abstracts.
Las clases final se conocen también por
clases
Una relación de realización, indica que una
clase implementa un comportamiento
específico de otra clase, llamada interface o
protocolo.
Una interface puede ser realizada por
muchas clases
La definición de una interfaz utiliza la palabra
reservada
interface
en lugar de class.
Los métodos de la interface son declarados igual
que los métodos de una clase abstracta, solo que
no requieren especificar que son asbtract (pero
lo son).
Ejemplo:
public
interface
Globo {
public void cambiarTamaño(int nDiametro);
public void mover (int x, int y);
Los
datos
de una interfaz son declarados
implícitamente
como
static y final.
public interface Movible {
public
static final
String DEF_LOC = “HQ Office
public void moverA(String s);
Al
utilizar
implements
el
compilador
comprobará
que
la
clase
haya
sido
implementada para cumplir con la declaración
de la interfaz; es decir, que haya sobreescrito
el método moverA.
public class Auto
implements
Movible
{
public void moverA(StringS)
Java simula herencia múltiple mediante el uso de interfaces.
Una clase puede
extender de una sola clase, pero
implementar cualquier número de interfaces.
Ejemplo:
En parejas, crearla interfaz PuedeCantar(que es
capaz de cantar), la cuales una interfaz muy
simple que sólo posee un método cantar.
Crearla clase Persona que implemente el
interfaz PuedeCantar y que cuando cante lo
haga con las notas musicales.
Crearla clase Canario y Gallo que implemente
el interfaz PuedeCantar y que muestre como
cantan