Poliformismo – Fundamentos de Programación Orientada a Objetos

El polimorfismo es la posibilidad de definir múltiples clases con funcionalidad diferente, pero con métodos o denominados de forma idéntica.

Poliformismo

El concepto de Polimorfismo es uno de los fundamentos para cualquier lenguaje orientado a objetos, las mismas raíces de la palabra pueden ser una fuerte pista de su significado: Poli = Múltiple,   morfismo = Formas

Esto implica que un Objeto puede tomar diversas formas.

Por ejemplo: Tome un objeto que sume dos números cualesquiera (enteros, punto flotante, etc.) y devuelve un total.  En este caso, lo que parece ser la misma operación mantiene en realidad un comportamiento único (suma de dos números) en forma transparente para diferentes tipos de argumento.  Esto es polimorfismo en acción.

Veamos otros conceptos: “Es el mecanismo que permite definir e invocar funciones idénticas en denominación e interfaz, pero con implementación diferente».

El polimorfismo se refiere a la posibilidad de definir múltiples clases con funcionalidad diferente, pero con métodos o propiedades denominados de forma idéntica, que pueden utilizarse de manera intercambiable mediante código cliente en tiempo de ejecución.

El polimorfismo en cualquier lenguaje de POO, puede ser usado de dos maneras fundamentales:

  • Polimorfismo basado en Herencia.
  • Polimorfismo en Sobrecarga de Métodos

Poliformismo Basado en Herencia

La mayoría de los sistemas de programación orientada a objetos proporcionan polimorfismo a través de la herencia.  Éste permite que las instancias de diferentes clases reaccionen de una forma particular al llamado de una función. 
El polimorfismo basado en la herencia implica definir métodos en una clase base y reemplazarlos con nuevas implementaciones en clases derivadas.

A través del concepto de la Herencia es posible ilustrar este comportamiento: 

  • Figura a = new Circulo();
  • Figura b = new Triangulo(); 

Inicialmente se puede pensar que este código generaría un error debido a que el tipo de referencia es distinta a la instancia del objeto, como se ha visto hasta ahora: Figura obj = new Figura();

Sin embargo, el fragmento anterior es correcto y demuestra el concepto de Polimorfismo.

En resumen, Polimorfismo es la habilidad de comportarse de diferentes formas, por ejemplo, un Ejecutivo tiene acceso a métodos de la clase Empleado. Recordemos que Ejecutivo “es un” Empleado.

En resumen, Polimorfismo es la habilidad de comportarse de diferentes formas, por ejemplo, un Ejecutivo tiene acceso a métodos de la clase Empleado. Recordemos que Ejecutivo “es un” Empleado.

➡ MIRA: Cómo traducir textos en inglés con tu cámara celular

Un objeto tiene solo una forma, que es dada cuando se construye el objeto, sin embargo, una variable es polimórfica porque puede referir a objetos de diferentes formas. En Java se permite, lo siguiente: Empleado  e = new Ejecutivo();

Usando la variable e, sólo se puede tener acceso a los atributos que son de la clase Empleado (Clase Padre), debido que para el compilador e es un Empleado y no un Ejecutivo.    Esto No es permitido: e.presupuesto = 2000000;  //Ilegal asignación a atributo de la clase Ejecutivo

Asumiendo lo siguiente:
Empleado e = new Empleado();
Ejecutivo m = new Ejecutivo();

Si se hace: e.mostrar() y m.mostrar() se invocan diferentes comportamientos.
El objeto e ejecuta la versión mostrar() de la clase Empleado y el objeto m, ejecuta la versión mostrar() de la clase Ejecutivo.

Ahora, que sucederá, si ejecutamos lo siguiente:
Empleado e = new Ejecutivo();
e.mostrar();  

De hecho, se obtiene el comportamiento asociado con el objeto al cual la variable refiere en tiempo de ejecución, es decir, con la clase que se hizo el new (Clase Hija). Esto quiere decir que, el comportamiento no es determinado en tiempo de compilación por tipo de variable. En el ejemplo previo, e.mostrar() ejecutará el método mostrar de la clase Ejecutivo. Este es un aspecto de polimorfismo, y a este comportamiento se le conoce como Invocación de Métodos Virtuales.

Reglas para la Sobreescritura de Métodos

El tipo de dato de retorno debe ser idéntico al del método a sobreescribir. El método de la clase Hija no puede ser menos accesible que el método a sobreescribir en la clase Padre.  Recuerde que el nombre del método y la lista de argumentos de un método de una clase hija deben ser idénticos al del método en la clase padre, para que el método de la clase hija pueda sobreescribir al del padre.

Invocación de Métodos Virtuales

Considere lo siguiente:

publicclassPadre{
    publicvoidHacer() { }
}


public class Hija extends Padre{
   private voidHacer() { }
}


publicclassUsaAmbas{
    publicvoidOtroHacer() {
       Padre p1=new Padre();
       Padre p2=new Hija();
       p1.Hacer();
       p2.Hacer();
    }
}

p2.Hacer() ejecuta el método de la versión de la clase Hija, pero no puede ser accedido porque fue declarado privado. 

 ➡ MIRA: Cómo utilizar los escritorios virtuales de Windows 10 para mejorar la productividad

Colecciones Heterogéneas

Colecciones de objetos con diferentes tipos de clases son denominados Colecciones Heterogéneas.
Empleado [ ] consejoDirectivo = new Empleado[10]

  • consejoDirectivo[0]= new Ejecutivo();
  • consejoDirectivo[1]=new Empleado();
  • consejoDirectivo[2]=new Secretaria();

Argumentos Polimórficos

Se pueden escribir métodos que acepten como argumentos objetos genéricos y trabajar apropiadamente con objetos de cualquier subclase. Por ejemplo:

//En la clase Implementacion
publicvoidafinar (Instrumento i){
    i.tocar();
}

El método afinar puede recibir en i la referencia de un objeto de Instrumento, Guitarra o Guzla.

La Clase Object

Es la clase administradora de todas las clases en Java.

Una declaración de clase sin la cláusula extends, implícitamente usa “extends Object”

public class Instrumento {
     . . . . . . .
}

Es equivalente a:

public class Instrumento extends Object{
     . . . . . . .
}

Operador instanceof

Dado que se pueden pasar objetos usando referencias a su clase padre, se desea conocer con cuál objeto se está actualmente trabajando. Suponga la siguiente jerarquía:
public class Instrumento extends Object
public class Guitarra extends Instrumento
public class Guzla extends Guitarra 

Operador instanceof
Suponga ahora que en el método afinar, antes de invocar al método tocar, debe registrar el número de cuerdas ó ajustar el tono dependiendo si se trata de una Guitarra ó una Guzla, respectivamente. Primero se debe Verificar que la referencia que llega en i sea una Guitarra ó una Guzla.

publicvoidafinar (Instrumento i){
     if(i instanceof Guitarra)
        {  //Proceso si es una Guitarra
        }
     elseif(i instanceof Guzla)
               {  //Proceso si es una Guzla
               }
      i.tocar();
}

➡ MIRA: Cómo convertir un archivo de Word a PDF

Casting de Objetos

En circunstancias en que se recibe la referencia a la clase padre y se tiene actualmente un objeto a una subclase, se puede restaurar la funcionalidad del objeto haciéndole un casting a la referencia. Por ejemplo:

publicvoidafinar (Instrumento i){
     if(i instanceof Guitarra)
        { Guitarra obj1=new Guitarra();
           obj1=(Guitarra) i;
           obj1.nro_cuerdas=5;
           obj1.tocar();
        }
     elseif(i instanceof Guzla)
               { Guzla obj2=new Guzla();
                  obj2=(Guitarra) i;
                  obj2.tono="re";
                  obj2.tocar();
               }
            elsei.tocar();
}

El concepto de polimorfismo, en cuanto a cambio de forma, se puede extender a los métodos.  Java permite que varios métodos dentro de una clase se llamen igual, siempre y cuando su lista de parámetros sea distinta.  Por ejemplo, si tuviéramos un método que sirviera para sumar números pero sin indicar de qué tipo. 

/* Diversos modos de sumar */
public classSumar {
           public float suma(float a, float b)
           {     System.out.println("Estoy sumando reales");
                  return a+b; }

     public int suma(int a, int b)

           {     System.out.println("Estoy sumando enteros");
                  return a+b; }

     public static void main(String[] args)

           {    float x = 1, float y = 2;      int v = 3, int w = 5;                  
                 System.out.println(suma(x,y));
                 System.out.println(suma(v,w)); }
}

La sobrecarga de métodos también pueden ser aplicada a los constructores.

public class Rectangulo {
     private int x1, y1, x2, y2;

public Rectangulo(int ex1, int ey1, int ex2, int ey2){
            x1 = ex1;  
            x2 = ex2;  
            y1 = ey1;
            y2 = ey2;
 }

public Rectangulo(){
            x1 = 0;
            x2 = 0;
            y1 = 1;
            y2 = 1;
}

public int calcularArea(){
            return (x2-x1) * (y2-y1); }
}

Contenido relacionado:

Te puede interesar

Deja una respuesta

Tu dirección de correo electrónico no será publicada.