jueves, 5 de noviembre de 2015

POLIMORFISMO

POLIMORFISMO

Para empezar con esta entrada, se ha de decir que el término “Polimorfismo” es una palabra de origen griego que significa “muchas formas”. Este termino se utiliza en la POO para “referirse a la propiedad por la que es posible enviar mensajes sin tácticamente iguales a objetos de tipos distintos“.

En esta entrada vamos a trabajar un ejemplo rápido y simple aplicando el concepto de Polimorfismo:


import java.util.*;

class Instrumento {
    public void tocar() {
System.out.println("Instrumento.tocar()");
    }
    public String tipo() {
return "Instrumento";
    }
    public void afinar() {}
}



class Guitarra extends Instrumento {
    public void tocar() {
System.out.println("Guitarra.tocar()");
    }
    public String tipo() { return "Guitarra"; }
    public void afinar() {}
}

class Piano extends Instrumento {
    public void tocar() {
System.out.println("Piano.tocar()");
    }
    public String tipo() { return "Piano"; }
    public void afinar() {}
}

class Saxofon extends Instrumento {
    public void tocar() {
System.out.println("Saxofon.tocar()");
    }
    public String tipo() { return "Saxofon"; }
    public void afinar() {}
}

// Un tipo de Guitarra 
class Guzla extends Guitarra {
       public void tocar() {
         System.out.println("Guzla.tocar()");
       }
       public void afinar() {
         System.out.println("Guzla.afinar()");
       }
     }

// Un tipo de Guitarra 
class Ukelele extends Guitarra {
    public void tocar() {
System.out.println("Ukelele.tocar()");
    }
    public String tipo() { return "Ukelele"; }
}

public class Musica {

    // No importa el tipo de Instrumento,
    // seguirá funcionando debido a Polimorfismo:
    static void afinar(Instrumento i) {
// ...
i.tocar();
    }

    static void afinarTodo(Instrumento[] e) {

for(int i = 0; i < e.length; i++)
   afinar(e[i]);
    }


    public static void main(String[] args) {
Instrumento[] orquesta = new Instrumento[5];
int i = 0;
// Up-casting al asignarse el Arreglo
orquesta[i++] = new Guitarra();
orquesta[i++] = new Piano();
orquesta[i++] = new Saxofon();
orquesta[i++] = new Guzla();
orquesta[i++] = new Ukelele();
afinarTodo(orquesta);
    }
}



Clase Música

En el código fuente de Musica.java son diseñadas diversas Clases que demuestran el uso de Polimorfismo:

  • Instrumento: Es utilizada como la Clase Base para el resto de Clases y en ella son definidos tres métodos: tocar,tipo y afinar.

  • Guitarra: Hereda ("Inherit") de la Clase Instrumento y redefine ("Override") los métodos de ésta.

  • Piano: Hereda ("Inherit") de la Clase Instrumento y redefine ("Override") los métodos de ésta.

  • Saxofon: Hereda ("Inherit") de la Clase Instrumento y redefine ("Override") los métodos de ésta.

  • Guzla: Hereda ("Inherit") de la Clase Guitarra y redefine ("Override") los métodos de ésta.

  • Ukelele: Hereda ("Inherit") de la Clase Guitarra y redefine ("Override") los métodos de ésta.

Las definiciones de la Clase principal Musica son descritas en los siguientes incisos:


  • El primer método definido en esta Clase llamado afinar toma como valor de entrada una referencia del tipo Instrumento, sobre la cual es invocado el método tocar.

  • Un segundo método nombrado afinarTodo toma como valor de inicia un arreglo de Instrumento, el cual es procesado por un ciclo que a su vez manda llamar el método afinar con los respectivos valores del arreglo.
Dentro del método principal se define lo siguiente:

  •          Primeramente se genera un arreglo de Instrumento para 5 Objetos.Se inicializa un primitivo i con un valor de cero.

  • A través de la referencia orquesta son asignados distintos Objetos al arreglo, nótese que aunque el arreglo es de tipo Instrumento es posible asignar los Objetos: Guitarra,Piano,Saxofon,Guzla,Ukelele.




  • Finalmente se invoca el método afinarTodo con la referencia que representa el arreglo de Instrumento.


Al ser ejecutado este programa se obtienen los siguientes resultados:

--java Musica----

Guitarra.tocar()
Piano.tocar()
Saxofon.tocar()
Guzla.tocar()
Ukelele.tocar()

Lo interesante de este resultado reside en la manera que fue realizada la invocación de métodos, el método que realiza las llamadas hacia las diversas clases es afinar dentro de la Clase Música, observe que este método toma como valor inicial una referencia del tipo Instrumento y se invoca el método tocar.

No hay comentarios:

Publicar un comentario