jueves, 17 de septiembre de 2015

Polimorfismo

El polimorfismo en la Programación Orientada a Objetos (POO), es muy importante pues nos permite poder utilizar métodos definidos en la Super Clase de diferentes maneras. Para que estos métodos puedan ser heredados y modificados por las subclases se deben de declarar como abstractos, cada clase que hereda estos métodos debe encargarse de definir el código que este método ejecutara.

También debemos mencionar que si una clase tiene por lo menos un método abstracto, esta clase debe declararse como abstracta sin importar si posee o no métodos ya definidos, así como variables y métodos de acceso a estas variables. A continuación  se muestra un pequeño ejemplo de Polimorfismo, tomando como base las clases utilizadas en el ejemplo de Herencia:

Codigo de la SuperClase Equipo

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejemploherencia;

/**
 *
 * @author Guillermo Antonio
 * En este caso se hace referencia 
 * a la superclase Object aunque no es necesario hacerlo
 */
public class Equipo extends Object{
    //definimos las variables y el tipo de variables que vamos a usar.
    String nombre;
    String marca;
    String modelo;
    String serie;
    String color;
    
    //creamos el constructor que recibe por parametro todos los datos

    public Equipo(String nombre, String marca, String modelo, String serie, String color) {
        this.nombre = nombre;
        this.marca = marca;
        this.modelo = modelo;
        this.serie = serie;
        this.color = color;
    }
//creamos los metodos de acceso para cada una de las variables
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    public String getSerie() {
        return serie;
    }

    public void setSerie(String serie) {
        this.serie = serie;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
    
    //creamos los metodos encender y apagar que son comunes para todos los equipos
    
    public void encender(Boolean enc){
    if (enc){
    System.out.print("Encendiendo Aparato \n");
    }
    }
    
    public void apagar(Boolean enc){
    if(!enc){
    System.out.print("Aparato Apagado \n");
    }
    }
    
}

codigo de la Subclase Audio: Esta clase se define como abstracta pues es la que contiene el metodo abstracto textoConsola, este metodo se diferenciara en cada una de las subclases que hereden de la superclase Audio.

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejemploherencia;

/**
 *
 * @author Guillermo Antonio
 * heredamos de la clase equipo todos sus metodos 
 * y caracteristicas
 * 
 */
public abstract class Audio extends Equipo{
//creamos el constructor de la clase audio
    //no es necesario definir las variables nombre,marca,modelo, etc
    //porque estas ya estan definidas en la superclase equipo
    //asi como tambien estan definidos sus metodos de acceso
    //solo agregaremos los atributos que tiene en particular esta subclase de equipo
    String formatoAudio;

    public Audio(String nombre, String marca, String modelo, String serie, String color, String formatoAudio) {
        super(nombre, marca, modelo, serie, color);
        //ponemos el valor de la variable formatoAudio que es la unica variable que no esta en la superclase equipo
        this.formatoAudio=formatoAudio;
    }
    //creamos los metodos de acceso para la variable que se creo en esta clase

    public String getFormatoAudio() {
        return formatoAudio;
    }

    public void setFormatoAudio(String formatoAudio) {
        this.formatoAudio = formatoAudio;
    }
    
    //se agregan los metodos unicos para esta clase
    public void reproducir(Boolean rpdr){
    if(rpdr){
    System.out.println("Reproduciendo");
    }else{
    System.out.println("Sin Reproducir");
    
    }
    }
    
    //metodo abstracto que sera definido por las subclases que heredan de esta superClase
    //estos metodos tienen que seguir el siguiente formato
           //abstract tipo nombreMetodo
    public abstract String textoConsola();
}

codigo de la clase AutoEstereo: esta clase implementa el metodo abstracto de la superclase Audio

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejemploherencia;

/**
 *
 * @author Guillermo Antonio
 * esta clase hereda de la superclase Audio, que 
 * a la vez ess una subclase que hereda de la superclase Equipo
 * esta clase va a tener los atributos y metodos tanto de la clase Equipo
 * asi como tambien de la clase audio
 * 
 */
public class AutoEstereo extends Audio{
    //definimos los atributos que son unicos para esta clase y no comparte con las otras subclases 
    //de la clase audio
    int potenciaSalida;
    String receptorMultimedia;
    
//este constructor recibe todos los valores y se los pasa a la super clase
    //por medio del metodo super.
    public AutoEstereo(String nombre, String marca, String modelo, String serie, String color, String formatoAudio,Integer potenciaSalida, String receptorMultimedia) {
        
        super(nombre, marca, modelo, serie, color, formatoAudio);
        
        this.potenciaSalida=potenciaSalida;
        this.receptorMultimedia=receptorMultimedia;
    }
    //creamos los metodos de acceso para los atributos definidos en esta clase

    public int getPotenciaSalida() {
        return potenciaSalida;
    }

    public void setPotenciaSalida(int potenciaSalida) {
        this.potenciaSalida = potenciaSalida;
    }

    public String getReceptorMultimedia() {
        return receptorMultimedia;
    }

    public void setReceptorMultimedia(String receptorMultimedia) {
        this.receptorMultimedia = receptorMultimedia;
    }
    //metodo que devuelve un String con todos los datos del autoEstereo
    public String mostrarDatos(){
    return "Datos: \n Nombre:"+this.nombre+"\n Modelo: "+this.modelo+" \n Marca: "+this.marca+"\n Serie: \t"+this.serie;
    }
//este es el metodo que se declaro como abstracto pero que en las sub clases
    //se tiene que definir como va a funcionar y cual es el codigo que va a ejecutar
    @Override
    public String textoConsola() {
      return "El formato de texto es el siguiente: \n"
              + "# pista, nombre, artista, duracion";  
    }
    
}

codigo de la Clase que contiene el metodo main:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejemploherencia;

import javax.swing.JOptionPane;

/**
 *
 * @author Guillermo Antonio
 */
public class EjemploHerencia {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        //en esta clase vamos a crear una instancia de la clase AutoEstereo
        //aunque la clase Auto Estereo no tenga el codigo para poner nombre, marca, etc
        //se tiene acceso a estos atributos y metodos a traves de la instancia de AutoEstereo
        //porque esta hereda de las clases Equipo y Audio
        
        AutoEstereo estereo=new AutoEstereo("Reproductor MP3", "Sony", "RXY76Y", "XZ345T", "negro", "MP3", 55, "4 canales");
        
        //a continuacion mostramos los datos en un mensaje
        
        JOptionPane.showMessageDialog(null, estereo.mostrarDatos());
        
        //despues de mostrar los datos del reproductor.. llamamos el metodo encender
        estereo.encender(true);
        //despues de encenderlo lo apagamos
        estereo.apagar(false);
        
        //imprimimos en consola el resultado del metodo implementado en la clase autoestereo
        System.out.println(estereo.textoConsola());
        
    }
    
}

Nota: Después de ver este ejemplo descargar el código fuente, e intenta crear mas métodos abstractos e implementarlos en diferentes subclases.



No hay comentarios:

Publicar un comentario

ESTE ES UN PEQUEÑO PASO QUE SE DEBE HACER PARA PODER COMENTAR