POLIMORFISMO El polimorfismo es la característica de la programación orientada a objetos que permite modificar la instancia de un objeto en tiempo de ejecución basado en una jerarquía de herencia. De esta forma, es posible generar una relación de vinculación denominada “binding”. El polimorfismo se puede realizar con clases superiores normales, abstractas e interfaces. El objetivo del polimorfismo, consiste en poder acceder a diferentes servicios en tiempo de ejecución sin necesidad de implementar diferentes referencias a objetos. Esta característica, provee una gran flexibilidad en el proceso de desarrollo y ejecución de la aplicación. Por ejemplo, considerando la jerarquía de herencia de Figuras Geométricas de la siguiente figura, es posible hacer uso del concepto de polimorfismo. Con base en el modelo anterior, se puede crear una referencia de la clase FiguraGeometrica de la siguiente forma. 1 FiguraGeometrica figura; A la referencia figura se le puede generar instancia de cualquiera de las clases que derivan de ella de la siguiente forma. 1 figura = new Circulo(5); 2 figura = new Cuadrado(5); 3 figura = new Rectangulo(5,2); 4 figura = new Triangulo(5,2); 5 figura = new Cubo(5); En la primera línea, el objeto figura tiene la forma de circulo, de tal forma que si se accede al método getArea, se ejecuta el método implementado en círculo. En la segunda línea, el objeto figura tiene la forma de cuadrado, de tal forma que si se accede al método getArea, se ejecuta el método implementado en cuadrado. En la tercer línea, el objeto figura tiene la forma de rectángulo, de tal forma que si se accede al método getArea, se ejecuta el método implementado en rectángulo. En la cuarta línea, el objeto figura tiene la forma de triangulo, de tal forma que si se accede al método getArea, se ejecuta el método implementado en triangulo. En la quinta línea, el objeto figura tiene la forma de cubo, de tal forma que si se accede al método getArea, se ejecuta el método implementado en cubo. La siguiente implementación del modelo presentado demuestra en tiempo de ejecución el concepto de polimorfismo. Clase FiguraGeometrica 01 package FigurasGeometricas; 02 03 public abstract class FiguraGeometrica { 04 05 protected double valor1; 06 07 public FiguraGeometrica(double valor1) { 08 super(); 09 this.valor1 = valor1; 10 } 11 12 public double getValor1() { 13 return valor1; 14 } 15 16 public void setValor1(double valor1) { 17 this.valor1 = valor1; 18 } 19 20 public abstract double getArea(); 21 public abstract double getPerimetro(); 22 } Clase Circulo 01 package FigurasGeometricas; 02 03 public class Circulo extends FiguraGeometrica { 04 05 public Circulo(double valor1) { 06 super(valor1); 07 } 08 09 @Override 10 public double getArea() { 11 return Math.PI*Math.pow(this.valor1, 2); 12 } 13 14 @Override 15 public double getPerimetro() { 16 return Math.PI*this.valor1; 17 } 18 } Clase Cuadrado 01 package FigurasGeometricas; 02 03 public class Cuadrado extends FiguraGeometrica { 04 05 public Cuadrado(double valor1) { 06 super(valor1); 07 } 08 09 @Override 10 public double getArea() { 11 return Math.pow(this.valor1, 2); 12 } 13 14 @Override 15 public double getPerimetro() { 16 return this.valor1*4; 17 } 18 } Clase Rectangulo 01 package FigurasGeometricas; 02 03 public class Rectangulo extends FiguraGeometrica { 04 protected double valor2; 05 06 public Rectangulo(double valor1, double valor2) { 07 08 super(valor1); this.valor2 = valor2; 09 } 10 11 public double getValor2() { 12 return valor2; 13 } 14 15 public void setValor2(double valor2) { 16 this.valor2 = valor2; 17 } 18 19 @Override 20 public double getArea() { 21 return this.valor1*this.valor2; 22 } 23 24 @Override 25 public double getPerimetro() { 26 return 2*this.valor1 + 2*this.valor2; 27 } 28 } Clase Triangulo 01 package FigurasGeometricas; 02 03 public class Triangulo extends FiguraGeometrica { 04 private double valor2; 05 06 public Triangulo(double valor1, double valor2) { 07 08 super(valor1); this.valor2 = valor2; 09 } 10 11 public double getValor2() { 12 return valor2; 13 } 14 15 public void setValor2(double valor2) { 16 this.valor2 = valor2; 17 } 18 19 @Override 20 public double getArea() { 21 return (this.valor1*this.valor2)/2; 22 } 23 24 @Override 25 public double getPerimetro() { 26 return this.valor1 + (2 * Math.sqrt((Math.pow(this.valor1, 2)+Math.pow(this.valor2, 2)))); 27 } 28 } Clase Cubo 01 package FigurasGeometricas; 02 03 public class Cubo extends Cuadrado { 04 05 public Cubo(double valor1) { 06 super(valor1); 07 } 08 09 public double getArea() { 10 11 } return Math.pow(this.valor1, 3); 12 } Clase Principal 01 package FigurasGeometricas; 02 03 public class Principal { 04 05 public static void main(String[] args) { 06 FiguraGeometrica figura; 07 08 figura = new Circulo(5); System.out.println(figura.getClass()); 09 10 System.out.println("Area: "+figura.getArea()); System.out.println("Perimetro: "+figura.getPerimetro()); 11 12 figura = new Cuadrado(5); System.out.println(figura.getClass()); 13 14 System.out.println("Area: "+figura.getArea()); System.out.println("Perimetro: "+figura.getPerimetro()); 15 16 figura = new Rectangulo(5,2); System.out.println(figura.getClass()); 17 18 System.out.println("Area: "+figura.getArea()); System.out.println("Perimetro: "+figura.getPerimetro()); 19 20 figura = new Triangulo(5,2); System.out.println(figura.getClass()); 21 22 System.out.println("Area: "+figura.getArea()); System.out.println("Perimetro: "+figura.getPerimetro()); 23 24 figura = new Cubo(5); System.out.println(figura.getClass()); 25 26 System.out.println("Area: "+figura.getArea()); System.out.println("Perimetro: "+figura.getPerimetro()); 27 } 28 } Salida Estandar 01 class FigurasGeometricas.Circulo 02 Area: 78.53981633974483 03 Perimetro: 15.707963267948966 04 class FigurasGeometricas.Cuadrado 05 Area: 25.0 06 Perimetro: 20.0 07 class FigurasGeometricas.Rectangulo 08 Area: 10.0 09 Perimetro: 14.0 10 class FigurasGeometricas.Triangulo 11 Area: 5.0 12 Perimetro: 15.770329614269007 13 class FigurasGeometricas.Cubo 14 Area: 125.0 15 Perimetro: 20.0 En la implementación de la clase Principal, se puede apreciar que el objeto figura cambia de forma cada vez que se hace una nueva instancia. Así mismo en cada instancia accede a la implementación del método de la clase instanciada. El último caso, realiza la instancia de la clase Cubo, en donde esta clase no tiene implementado el método getPerimetro. Para este caso, en el llamado a este método, se accede al método getPerimetro implementado en la clase superior que es Cuadrado.