jueves, 30 de mayo de 2013

Polimorfismo en Java

Al escuchar la palabra polimorfismo lo primero que se nos viene a la mente es "Muchas Formas" y bueno, si, básicamente esta es la idea general, pero y que mas gira en torno a esto???........

en esta entrada veremos algunos ejemplos y puntos a tener en cuenta sobre el polimorfismo en la programación orientada a objetos y para eso aplicaremos otros conceptos trabajados con anterioridad..... y mas adelante desarrollaremos un ejemplo en Java donde pondremos a prueba lo aprendido en esta entrada......


Algunas Ideas.

Como se mencionó en la entrada sobre Conceptos Básicos, podemos definirlo como la capacidad que tienen los objetos de comportarse de múltiples formas, programando de manera general en vez de hacerlo de forma especifica...

Alguna vez consultando, definían este concepto como la forma en la que podemos tratar una subClase como si fuera una Clase del tipo de su superClase, usando solo los métodos o atributos disponibles para la Clase declarada..... es decir, si tenemos una clase "X" podemos decir que "X" es de tipo "Y" esto se cumple solo si existe una relación de herencia entre ellas, ya sea si "X" hereda de "Y" (extends) o si "X" implementa a "Y" (implements)

Retomando (de manera reducida) el ejemplo de la entrada sobre conceptos básicos en el punto sobre polimorfismo, se explica mejor lo anterior usando "X" como cualquier clase Cuadrado, Triangulo o Circulo y "Y" como la clase FiguraGeometrica, por lo tanto decimos que por ejemplo la clase Triangulo es de tipo FiguraGeometrica, en Java esto lo representamos asi:

class FiguraGeometrica{
 
}

class Triangulo extends FiguraGeometrica {
 
}

public class Principal{
 
   public void metodo(){
  /**Puedo crear objetos polimorficos*/
  /**Objeto Triangulo de tipo FiguraGeometrica*/
  FiguraGeometrica triangulo=new Triangulo();
 }
}

Vemos que FiguraGeometrica es la superClase y Triangulo es la clase hija o subClase, y por medio del polimorfismo podemos crear una instancia de Triangulo de tipo FiguraGeometrica...

Algunas Consideraciones. 

(Estas consideraciones fueron tomadas de la revista digital JavaWord pues me parecen muy claras a la hora de trabajar con polimorfismo.)

Como en todo, tenemos unas reglas que se deben cumplir y tener en cuenta cuando vamos a trabajar con objetos polimorficos, estas son :
  • Una variable de referencia puede ser de un solo tipo, y una vez que fue declarada, ese tipo jamás puede modificarse..... por ejemplo, si declaramos triangulo de tipo FiguraGeometrica, no podemos decir mas adelante que el mismo objeto triangulo es de tipo FiguraPuntiaguda... 
  • Una referencia es una variable, de manera que puede ser reasignada a otros objetos (a menos que se declare como final). por ejemplo podemos hacer lo siguiente:
 FiguraGeometrica miFiguraGeometrica = new FiguraGeometrica();
 Cuadrado miCuadro=new Cuadrado();
  
 /**Puedo crear objetos polimorficos, asignando su referencia*/
 miFiguraGeometrica=miCuadro;

  • Una variable de referencia puede tomar como referencia cualquier objeto del mismo tipo, o un subtipo del mismo..... va muy ligada a la anterior, pero nos dice que si por ejemplo tenemos la clase cuadroPequeño que es subClase de cuadro, al ser "nieta" de FiguraGeometrica, si se crean instancias de ella, se pueden reasignar a instancias de FiguraGeometrica... 
  • Un tipo de variable de referencia determina los métodos que pueden ser invocados sobre el objeto que la variable referencia.... Triangulo al ser de tipo FiguraGeometrica puede acceder no solo a los métodos de la clase Triangulo sino también a los de FiguraGeometrica (Claro, pues tiene que existir una relación de Herencia entre ellos)  
  • Una variable de referencia puede tener como tipo el de una interface. Si es declarada de esta manera, podrá contener cualquier clase que implemente la interfaz..... las interfaces también permiten el uso de herencia, por lo tanto podemos crear objetos usando para esto una interfaz, por ejemplo si FiguraGeometrica fuera una interface, lo anterior seria igual..... (esto también aplica para las clases Abstractas).

Como mencionamos en entradas pasadas, las clases abstractas y las interfaces (al ser clases completamente abstractas) no pueden ser instanciadas, o no directamente, la única forma de hacerlo es mediante la herencia, ya que así extendemos sus funcionalidades creando objetos referenciando clases pero siendo del tipo de su superClase (abstracta o interface)

Hasta aquí la parte teórica, espero que sea de utilidad..................... y en la próxima entrada veremos un ejemplo simple de como aplicar este concepto mediante un ejemplo en Java!!!


Referencias.

Revista JavaWorld
SCJP Sun Certified Programmer for Java 6



También te podría Interesar. 


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó, te invito a compartir y Suscribirte ingresando al botón "Participar en este sitio" para darte cuenta de mas entradas como esta ;)

10 comentarios:

  1. Muchas gracias por la info amigo!

    ResponderEliminar
  2. muchas gracias pero creo que falta mucha explicacion de usos ya que hay libro que dice que la sobrecarga y la sobre escritura es un tipo de polimorfismo, ya se que este tema es un poco complejo

    ResponderEliminar
    Respuestas
    1. Hola, si, tienes razón, esos temas los tengo pendientes para subir, sin embargo puedes continuar con el siguiente ejemplo donde se aplica el concepto mas detallado................gracias por comentar y espero muy pronto publicar mas entradas sobre el tema ;)

      Eliminar
  3. Si fueras tan amable en términos generales cuál sería el concepto de polimorfismo (en palabras)
    Gracias!

    ResponderEliminar
    Respuestas
    1. Seria la propiedad que tienen los objetos de tener comportamientos de otros objetos, asì al decir Animal perro=new Perro(), vamos a crear un objeto perro con caracteristicas de la superClase Animal.... esto es muy usado cuando por ejemplo se requiere que el objeto que se envie sea de tipo Perro, pero nosotros por alguna razòn queremos enviar un Objeto Animal, asi de esta manera vamos a mandar nuestro objeto animal pero haciendolo pasar por un Perro....

      Eliminar
  4. Hola Cristian Feliz Día y muchas gracias por tus aportes

    Tengo una duda sobre las reglas del polimorfismo, cuando te refieres a que un tipo de referencia determina los métodos que pueden ser invocados por el objeto, por ejemplo supongamos para tu ejemplo que tenemos una superclas como lo es FiguraGeométrica que se crea un objeto de Triangulo, lo trate de hacer en java pero no puedo acceder a los métodos que están creados en la clase Triangulo, a los que hereda y sobreecribe si se pueden acceder pero a los propios de la clase no. Eso es normal y revise en la web y se puede acceder mediante el DownCastng, ¿ entonces el polimorfismo esta estrechamente ligado al DownCasting o son cosas diferentes ?

    ResponderEliminar
  5. Hola Cristian! Muchas gracias por la info, mi amigo, tengo una duda con polimorfismo a ver si puedes iluminarme:

    Tengo una interface

    public interface FabricaVehiculo
    {
    public abstract Automovil creaAutomovil(String modelo, String color,
    int potencia, double espacio);

    //Otros métodos
    :
    :
    }

    De esta interface tengo varias clases que implements de esta, en la cual heredan todos los métodos, que como son abstractos de por sí, entonces se implementan todos obligatoriamente en cada una de las clases, bien aquí va mi duda:

    Una de mis clases que implemets dicha interface debe hacer polimorfismo del método heredado de la interface, yo la estoy haciendo así:

    public class FabricaVehiculoGasolina implements FabricaVehiculo
    {

    public Automovil creaAutomovil(String modelo, String
    color, int potencia, double espacio)
    {
    return null;
    }

    public Automovil creaAutomovil(String modelo, String color,
    int potencia, double espacio, double lts)
    {
    return new AutomovilGasolina(modelo, color,
    potencia, espacio, lts);
    }

    //Otros métodos
    :
    :
    }

    Ya que necesito en esta clase agregar a este método un parámetro adicional, pero a la hora de compilar, me indica que no puede encontrar dicho método polimórfico ya que espera los parámetros del método especificado en la interface, será que no se puede hacer polimorfismo de un metodo heredado de una interface?

    En mi programa principal lo invoco así:

    FabricaVehiculo fabrica;

    Automovil[] autos = new Automovil[nAutos];

    fabrica = new FabricaVehiculoGasolina();

    for (int index = 0; index < nAutos; index++)
    autos[index] = fabrica.creaAutomovil("estandar",
    "amarillo", 6+index, 3.2, 2.7);

    Al compilar me indica el ste error:


    required: String,String,int,double
    found: String,String,int,double,double

    Gracias.
    reason: actual and formal argument lists differ in length

    ResponderEliminar
  6. Hola Cristian! Ya lo resolví, ciertamente como decía julian salas, cuando creas el objeto en base a su superclase o interface y no a su clase específica, no puedes acceder a los métodos propios o que sobrecargo, sólo puedes acceder a los métodos que se declararon en la superclase o interface, en mi caso particular no podía acceder al método que había sobrecargado en la clase específica por lo que tuve que hacer un downcasting dinámico para poder accederlo en tiempo de ejecución ya que en mi programa sólo usaría dicho método una vez.....

    Bien, en el programa principal, donde trato de llamar al método sobrecargado en la linea:

    autos[index] = fabrica.creaAutomovil("estandar",
    "amarillo", 6+index, 3.2, 2.7);

    La cambié por:

    autos[index] = ((FabricaVehiculoGasolina) fabrica).creaAutomovil("estandar",
    "amarillo", 6+index, 3.2, 2.7);

    Con lo cual hago un downcasting dinámico para acceder al método sobrecargado en la clase específica y así no cambio en tipo original con el que se creó el objeto o sea

    FabricaVehiculo fabrica; //Mantiene el tipo de superclase

    Espero ayude.

    Gracias.

    ResponderEliminar
    Respuestas
    1. Hola, que pena no poder contestar, he estado muy corto de tiempo, pero me alegra que lo pudieras resolver y que te sirviera la entrada, gracias por compartir la soluciòn.

      Eliminar

Eres libre de realizar cualquier comentario, desde que pueda ayudar con gusto lo atenderé, y si es un critica, bienvenida sea!!!