jueves, 10 de mayo de 2012

Polimorfismo


Definición

      El polimorfismo se produce cuando un método adopta más de una forma. Un método puede modificar su comportamiento de acuerdo a su necesidad.

Como ejemplo se puede utilizar lo siguiente:

class Numero {   
    protected int numero;           
    public void proximo(){       
    }   
    @Override
    public String toString(){
        return " " + numero;
    }
}
    class NumeroPositivo extends Numero{       
        public NumeroPositivo(){
          numero = 0;
        }       
        public void proximo(){
        numero = numero + 1;
        }
    }   
    class NumeroNegativo extends Numero{       
        public NumeroNegativo(){
            numero = 0;
        }       
        public void proximo(){
        numero = numero - 1;
        }
    }

public class Programa {         
        public static void main(String[] args) {           
            Numero positivo = new NumeroPositivo();
            Numero negativo = new NumeroNegativo();
            System.out.println("Numero positivo inicial:" + positivo);
            System.out.println("Numero negativo inicial:" + negativo);
            positivo.proximo();
            negativo.proximo();
            System.out.println("Numero positivo siguiente:" + positivo);
            System.out.println("Numero negativo siguiente:" + negativo);
            positivo.proximo();
            negativo.proximo();   
            System.out.println("Numero positivo siguiente:" + positivo);
            System.out.println("Numero negativo siguiente:" + negativo);
            }
}

El resultado de este programa es el siguiente:

Numero positivo inicial: 0
Numero negativo inicial: 0
Numero positivo siguiente: 1
Numero negativo siguiente: -1
Numero positivo siguiente: 2
Numero negativo siguiente: -2

La conclusión que debemos observar en este ejemplo es que se tienen dos instancias de Numero, una instancia de NumeroPositivo y una de NumeroNegativo, cada cual tiene un comportamiento distinto. Sin embargo a la hora de declararlo se los declaro en su forma genérica de Numero y se tiene el método próximo () asociado.

El polimorfismo ha permitido que cada uno se comporte de manera distinta, y sin embargo parece llamarse siempre al mismo método. Es decir, es distinto el próximo negativo del próximo positivo, y eso se refleja en el resultado.

Otra cosa que puede verse en este ejemplo es que al imprimir los objetos positivos y negativos se llama automáticamente al método toString (), es el modo en el que Java imprime sus objetos en pantalla. Y el aprovechamiento del mecanismo de herencia, en la programación del método toString () que retorna el valor de numero como un String, es decir, algo que puede imprimirse fácilmente. Al llamarlo en un NumeroPositivo, como este no lo tiene programado, se ejecuta el que esta definido en la clase padre Numero. Al llamarlo en un NumeroNegativo también se llama al de la clase padre.

Con redefinición:

Se llama polimorfismo con redefinición cuando en una clase sobreescribimos un método, definido en la superclase.

Ejemplo en Java:

      public class Persona{
               public void cantar(){
                                //Esto es un comentario. Aca va la definicion.
                }
      }
      class Cantante extends Persona{
                 public void cantar(){
                               //Esto es un comentario. Aca va la redefinicion.
                 }
      }

En este caso se puede ver que todas las personas pueden cantar (), sin embargo no es lo mismo cantar () en la clase Cantante, pues el cantante logra mayor escala, mayor volumen de voz, y entona de una forma muy preparada. Un cantante logra llegar más lejos con su canto que una persona común. Al redefinir el método en la clase Cantante se logra que se ejecute el método cantar () de cantante en lugar de método cantar () de persona. Por lo tanto la especialización que se logra con este mecanismo permite cambiar el comportamiento de una familia de clases.

Sin Redefinición

Se llama polimorfismo sin redefinición cuando un método tiene distinto comportamiento de acuerdo a la clase a la que pertenece.

Ejemplo en Java:

      public class Persona{
                               public void beber(Agua unPocoDeAgua){
                                 //Esto es un comentario. Aca va la definicion.
                                 }
      }

      class Animal{
                   public void beber(Agua unPocoDeAgua){
                               //Esto es un comentario. Aca va otra definicion.
                               }
      }

En este caso ambas clases logran beber (), es decir que ambas clases tienen definido el método beber, solo que uno de los métodos beber lo hace como humano, y otro lo hace como un animal, el comportamiento es bien distinto, aunque el nombre sea el mismo.

2 comentarios:

  1. con redefinicion se coloca la palabra abstrac? y sin redifinicion es solo con la herencia y el mismo nombre del metodo de la clase padre?

    ResponderEliminar