Polimorfismo

De Manuais Informática - IES San Clemente.
Revisión del 20:41 25 ene 2008 de Arribi (discusión | contribs.) (→‎Concepto)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)
Ir a la navegación Ir a la búsqueda

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:

Polimorfismo.gif

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.