Polimorfismo
El polimorfismo permite referirse a objetos de diferentes clases por medio del
mismo elemento y realizar la misma operacin de formas diferentes, de acuerdo al
objeto a que se hace referencia en cada momento.
Otra forma de definir el polimorfismo: el envo del mismo mensaje desencadena
acciones diferentes segn el objeto que lo recibe. Un ejemplo tpico es la operacin
arrancar cuando se aplica a diferentes tipos de motores; en cada caso la operacin
de arrancar se realiza de forma diferente.
La construccin del lenguaje que hace posible el polimorfismo es la ligadura
dinmica (conocida tambin por ligadura tarda o postergada) entre llamadas a
mtodos y los cuerpos reales de dichos mtodos.
La ligadura dinmica supone que el cdigo a ejecutar en respuesta a un mensaje
no se determinar hasta el momento de ejecucin.
En Java la ligadura dinmica se basa en la capacidad de redefinir (reemplazar)
mtodos en la subclase, en el contexto de herencia.
Polimorfismo
Conclusin:
En una jerarqua de herencia, cuando se llama a mtodos desde una referencia a la superclase
que han sido redefinidos en las clases derivadas, lo que se tiene en cuenta es el tipo del objeto
actual referenciado. De tal forma que se ejecutar el mtodo redefinido en el tipo actual.
En definitiva, al llamar a un mismo mtodo sobre una misma variable referencia se producir la
llamada a mtodos distintos dependiendo del objeto referenciado.
En una jerarqua de Vehculos que deben pagar el peaje de una autopista:
Vehiculo cual;
// public abstract class Vehiculo { ... }
cual = new Turismo();
cual.calculoTasa();
cual = new CicloMotor();
cual.calculoTasa();
cual = new Camion();
cual.calculoTasa();
La llamada es sobre una variable de tipo Vehiculo, el mtodo ejecutado depende del objeto actual
EJEMPLO DE POLIMORFISMO
Consideremos la clase Instrumento
como la clase base de la que se
derivan otras clases, tales como Piano,
Guitarra, GuitarraElctrica y Bombo.
Cada instrumento musical debe tener
la posibilidad de tocar una pieza y
afinar. En este caso la clase
Instrumento declara los siguientes
mtodos:
class Instrumento
{
public void tocar(String cd)
{
System.out.println("instrumento
interpreta " + cd);
}
// public abstract bool
afinar();
// NO SE DESARROLLA
}
Cada clase derivada debe definir sus propias
versiones concretas de los mtodos que han sido
declarados en la clase base.
class GuitarraElectrica
extends Guitarra
{
public void
tocar(String cd)
{
System.out.println(
"Guitarra
electrica toca " + cd);
}
}
pin[i].tocar("Rumba");