Listado completo de tutoriales

91 - Polimorfismo en Java


El polimorfismo es una característica de la programación orientada a objetos que permite llamar a métodos con igual nombre pero que pertenecen a clases distintas.

En Java es necesario que las clases compartan una superclase común para implementar el polimorfismo, luego veremos que también se puede implementar el polimorfismo en Java mediante interfaces.

Con el polimorfismo podemos implementar programas que luego son fácilmente extensibles.

Problema:

Confeccionar una clase abstracta llamada 'Operacion', en la misma definir los atributos: valor1, valor2 y resultado.

Definir un método abstracto 'operar'.

Luego definir 2 subclases llamadas 'Suma' y 'Resta' que hereden de la clase 'Operacion'.

Crear un ArrayList de tipo 'Operacion' y almacenar objetos de tipo 'Suma' y 'Resta'.

Clases: Operacion

public abstract class Operacion {
    protected int valor1, valor2, resultado;

    public Operacion(int valor1, int valor2) {
        this.valor1 = valor1;
        this.valor2 = valor2;
    }

    public void imprimir() {
        System.out.println(resultado);
    }

    public abstract void operar();
}

La clase 'Operacion' es abstracta y define un método abstracto llamado 'operar'. Luego significa que cualquier clase que herede de 'Operacion' está obligado a implementarlo.

La implementación del método operar depende de la subclase y el concepto que represente la misma.

Clases: Suma

public class Suma extends Operacion {

    public Suma(int valor1, int valor2) {
        super(valor1, valor2);
    }

    public void operar() {
        resultado = valor1 + valor2;
    }

}

Clases: Resta

public class Resta extends Operacion {

    public Resta(int valor1, int valor2) {
        super(valor1, valor2);
    }

    public void operar() {
        resultado = valor1 - valor2;
    }

}

Las dos subclases de la clase 'Operacion' cumplen con el contrato de implementar el método 'operar', en caso de no hacerlo se genera un error sintáctico.

Veamos ahora como se genera el comportamiento polimórfico:

Clases:

import java.util.ArrayList;

public class Prueba {

    public static void main(String[] ar) {
        ArrayList<Operacion> lista1 = new ArrayList<Operacion>();
        lista1.add(new Suma(2, 34));
        lista1.add(new Resta(3, 2));
        lista1.add(new Suma(100, 1));
        for (Operacion op : lista1) {
            op.operar();
            op.imprimir();
        }
    }
}

Definimos un 'ArrayList' de tipo 'Operacion'. Esto no significa que crearemos objetos de tipo 'Operacion', ya que no se pueden crear objetos de una clase abstracta, sino almacenaremos objetos de clases que hereden de 'Operacion':

        ArrayList<Operacion> lista1 = new ArrayList<Operacion>();
        lista1.add(new Suma(2, 34));
        lista1.add(new Resta(3, 2));
        lista1.add(new Suma(100, 1));

Creamos objetos de las clases 'Suma' y 'Resta' y los agregamos al 'ArrayList'.

Ahora gracias al polimorfismo podemos llamar al método 'operar' y se ejecutará el que corresponde:

        for (Operacion op : lista1) {
            op.operar();
            op.imprimir();
        }

Nuestra aplicación el fácilmente extensible, si necesitamos implementar las operaciones 'Multiplicacion', 'Division', elevar a una cierta potencia etc. solo debemos heredar de 'Operacion' y definir la lógica para el método 'operar'.


Retornar