Polimorfismo.

El polimorfismo es uno de los aspectos más interesantes de la programación orientada a objetos. Veámoslo con un ejemplo. Yo puedo tener una interface que me defina figuras geométricas:

package curso;

public interface Figura {

   public int obtenerArea();

}

Esa interface puede ser implementada por diversas figuras geométricas, por ejemplo un cuadrado:

package curso;

public class Cuadrado implements Figura {

   protected int lado;

   public Cuadrado(int l) {
      lado=l;
   }

   public int obtenerArea() {
      return lado*lado;
   }

}

Y un rectángulo:

package curso;

public class Rectangulo implements Figura {

  protected int base;
  protected int altura;

  public Rectangulo(int b, int h) {
    base=b;
    altura=h;
  }

  public int obtenerArea() {
    return base*altura;
  }

}

En otra clase podría tener un array de figuras en la que indistintamente tuviese almacenados rectángulos y cuadrados, y mi interés sería recorrer ese array calculando el área de la figura para cada posición. Mediante la programación tradicional tendríamos que hacer algo como:

for (i=0;i<v.length;i++)
    switch (clase(v[i]) {
        case Rectangulo: // llamar al método específico de cálculo de área específico para rectángulo.
        case Cuadrado:  // llamar al método específico de cálculo de área específico para cuadrado.
    }

Con lo cual en el caso de que añadiésemos un nuevo tipo de Figura por ejemplo un triángulo, habría que modificar ese código, para añadir una entrada más al switch que tratase el caso del triángulo. Estas modificaciones en proyectos grandes pueden ser muy costosas y es una de los hábitos de programación que se eliminan con la orientación a objetos. Veamos cómo sería el código:

import curso.Cuadrado;
import curso.Rectangulo;
import curso.Figura;

public class Prueba3 {

  public static void main (String args[]) {

      Cuadrado c = new Cuadrado(10);
      Rectangulo r = new Rectangulo (10,5);
      Figura vector[] = new Figura[2];
      vector[0]=c;
      vector[1]=r;
      calcularAreaVector(vector);
   }

   public static void calcularAreaVector(Figura[] v) {
      for (int i=0;i<v.length;i++)
         System.out.println ("El perímetro es... "+v[i].obtenerArea());
   }

}

En este código aunque añadiésemos un nuevo tipo de Figura, por ejemplo el triángulo, el método calcularAreaVector jamás tendrá que ser modificado, ya que hace uso del polimorfismo que te da la orientación a objetos, aplica sobre cada posición del vector v, que tiene el tipo estático Figura, el método obtenerArea, y el entorno Java en tiempo de ejecución mira el tipo dinámico que tiene cada posición aplicándole el método correspondiente a la clase a la que pertenece, la posición cero a la clase Cuadrado y la uno a la Rectangulo.

Veamos la ejecución de este ejemplo que se encuentra en el directorio:

\Curso Java\Java\ejemplos\curso


Aprovechemos para hacer algunos apuntes sobre las interfaces:



Ejercio 1.

Basándonos en el ejemplo añadir una clase Triangulo.java que tenga como atributos la base y la altura, y añadirla al vector definido en Prueba3.java en la posición 2 y ejecutar esta clase para ver que se calcula el área del triángulo.


Ejercio 2.

Para el ejemplo anterior hacer lo mismo para calcular el perímetro, incluir los métodos necesarios en las distintas clases.