POLIMORFISMO El polimorfismo es la característica de la

Anuncio
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.
Descargar