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.



lunes, 14 de septiembre de 2015

Ejemplos de Programación Orientada a Objetos: Herencia

Cuando hablamos de programación orientada a objetos, estamos hablando de muchas características y beneficios que tiene este tipo de programación. Cuando reutilizamos código nos beneficia pues nos hace mas productivos, no tenemos que volver a programar las mismas lineas de código cada vez que necesitamos realizar la misma acción: mostrar datos en pantalla por ejemplo, esta es la esencia de la POO.

En esta entrada nos enfocaremos en la herencia, este es un beneficio de la programación Orientada a Objetos (POO), que tiene como fin establecer las características (atributos) y métodos mas generales de acuerdo a un grupo de objetos que guardan similitudes, pero que al final tienen una que otra diferencia.

En este tema vamos a diferenciar los atributos generales y los particulares de cada miembro del grupo de objetos que guardan una estrecha relación de similitud. Para lo cual crearemos dos clases en JAVA, una super clase que es la que contendrá los atributos y métodos mas generales del grupo de objetos, y varias sub clases que heredaran los atributos y métodos de la super clase, pero que tendrán atributos y métodos que difieren de los otros miembros del grupo.

Como ejemplo crearemos las clases que se detallan en la siguiente jerarquía.
Como podemos ver en la jerarquía, la super clase se llama Equipo y esta contendrá los atributos (características) y métodos comunes para todo objeto del grupo, en el siguiente nivel se puede observar 4 subclases que heredaran de la super clase Equipo, estas subclases son: Audio, Vídeo, Electrodomésticos y Electrónica. Estas subclases a la vez son super clases, pues hay sub clases que heredan de ellas, en el tercer nivel de la jerarquía se encuentran las sub clases que heredaran los atributos y caracteristicas de las super clases Audio, Vídeo, Electrodomésticos y Electrónica.

A continuación crearemos las clases en JAVA y observaremos el resultado del uso de la HERENCIA:
La clase principal (super clase), tiene los siguientes atributos y métodos:

Atributos:

  • nombre
  • marca
  • modelo
  • serie
  • color
  • etc.
Métodos:
  • Encender
  • Apagar
  • etc.
Todas las clases en JAVA heredan de la super clase Object, aun cuando el programador omita hacer referencia a esta clase, en el ejemplo se hace referencia a esta clase pero no es necesario. 

NOTA: para que una clase herede de otra se hace uso de la palabra reservada extends.

Codigo de la super clase 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

/*
 * 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 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");
    
    }
    }
    
}

Codigo de la sub clase AutoEstereo, esta hereda de la clase audio que a su vez hereda de la clase 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
 * 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;
    }
    
}


Codigo de la clase principal donde se encuentra el método 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);
    }
    
}

Aun faltan algunas clases, les queda a ustedes como tarea desarrollarlas y tomar en cuenta los aspectos que se han explicado en esta entrada.



NOTA: a continuación adjunto el proyecto en un archivo comprimido .rar, espero les sea útil este ejemplo. Para comprender y manejar este y otros temas de POO, deben practicar.


Saludos.