Polimorfismo
Concepto
O polimorfismo trata xerarquías de obxectos ou de clases que implementan a mesma interface, coma se dunha única clase se tratara. Isto permite realizar a ocultación nas clases e ver unha xerarquía de clases como unha única clase. No polimorfismo establécese unha correlación entre a chamada a un método e o código das diferentes clases da xerarquía que efectivamente se asocia a esta chamada.
O uso do polimorfismo permite separar o que facer do como facelo. Para que se poida producir polimorfismo entre clases, se debe poder realizar un enlace dinámico entre o método e as diferentes clases.
Exemplo
Supoñamos a seguinte xerarquía de clases:
O seguinte código implementa a xerarquía anterior:
public class BancoDePruebas {
public static void main(String[] args) {
MandoADistanciaUniversal madu = new MandoADistanciaUniversal();
Video v = new Video();
Dvd dvd1 = new dvd();
System.out.println(madu.encender(v));
System.out.println(madu.encender(dvd1));
}
}
class MandoADistanciaUniversal{
public String encender(DispositivoVisual dv) {
return (dv.play());
}
}
abstract class DispositivoVisual {
abstract public String play();
abstract public String stop();
abstract public String rewind();
}
class Dvd extends DispositivoVisual {
public String play(){
return ("dvd play");
}
public String stop(){
return ("dvd stop");
}
public String rewind(){
return ("dvd rewind");
}
}
class Video extends DispositivoVisual {
public String play(){
return ("Video play");
}
public String stop(){
return ("Video stop");
}
public String rewind(){
return ("Video rewind");
}
}
Na clase BancoDePruebas créase un obxecto da clase Vídeo, un obxecto da clase DVD e un obxecto
MandoADistanciaUniversal. Sobre este último facemos dúas chamadas ao método encender (na primeira, o parámetro é de tipo vídeo, e na segunda, de tipo DVD), cando chegan á clase MandoADistanciaUniversal, o
enlace dinámico chama ao método play que corresponde a cada dispositivo. E estes enlaces realízanse en tempo de execución.
Aínda que poida parecer o contrario, non podemos relacionar o polimorfismo co concepto de sobrecarga de funcións. A sobrecarga consiste en definir métodos co mesmo nome pero distinta sinatura (diferentes argumentos, tipo ou número). Dado que é posible identificar as sobrecargas en tempo de compilación, estarían relacionadas co concepto de enlace estático. Pola contra, no polimorfismo non é posible coñecer en tempo de compilación a que clase da xerarquía estase facendo referencia.