Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre la abstaccion, la cual por diccionario es:

la cualidad de tratar con ideas en lugar de los eventos

El Tinchicus
Anuncios

Un ejemplo de esto seria cuando enviamos un mail, usualmente el usuario no sabe lo que sucede despues de enviado el mail y desconoce los complejos protocolos que se encargan de ello sin embargo nosotros para enviarlo solo necesitamos el contenido, la direccion de destino y apretar Enviar.

Anuncios

En programacion Orientada a objetos la abstraccion es el proceso de ocultar los detalles de la implementacion al usuario y solo se mostrara la funcionalidad, es decir el usuario obtendra la informacion que el objeto hace en lugar de como lo hace y en Java se hace implementando las clases abstractas e implementando interfaces

Anuncios

Clases Abstractas

Las clases abstractas se declaran por medio de la palabra abstract y contienen las siguientes propiedades:

  • Estas clases pueden o no tener metodos abstractos, por ejemplos metodos sin un cuerpo ( public void get(); )
  • Si la clase tiene aunque sea un solo metodo abstracto debe ser declarado como abstracto
  • Las clases declaradas como abstractas no pueden ser instanciadas
  • Para usar una clase abstracta esta debe ser heredada desde otra clase y proveer implementaciones para los metodos abstractos en ella.
  • Si se hereda una clase abstracta, se deben crear implementaciones para todos los metodos en ella
Anuncios

Para entender un poco mejor este concepto veamos el siguiente ejemplo, el cual constara de dos clases, una para nuestro empleado donde el nombre del archivo sera Empleado.java y luego tendremos la clase que sera nuestro programa llamado PruebaAbstracta.java para ello comencemos con la primera clase:

Empleado.java

public abstract class Empleado
{
        private String nombre;
        private String direccion;
        private int numero;

        public Empleado(String nombre, String direccion, int numero)
        {
                System.out.println("Construyendo un empleado");
                this.nombre = nombre;
                this.direccion = direccion;
                this.numero = numero;
        }

        public double pagoComputado()
        {
                System.out.println("Dentro del pago computado al empleado");
                return 0.0;
        }

        public void chequeCorreo()
        {
                System.out.println("Enviando el cheque por correo a "
                                + this.nombre + " " + this.direccion);
        }

        public String toString()
        {
                return nombre + " " + direccion + " " + numero;
        }

        public String getNombre()
        {
                return nombre;
        }

        public String getDireccion()
        {
                return direccion;
        }

        public void setDireccion(String nueva)
        {
                direccion = nueva;
        }

        public int getNumero()
        {
                return numero;
        }
}
Anuncios

Este caso es muy similar al visto al post anterior, donde tendremos una clase llamado Empleado, en lugar de Trabajador, y en la cual habra un constructor para iniciar todos los datos del mismo, y las funciones para recuperar los datos, una para ingresar una nueva direccion, chequeCorreo() la cual se encarga de notificar del envio del cheque al empleado con el nombre y la direccion pero observen al principio de la misma, en ella declaramos a toda la clase como abstracta por ende todos estos metodos son abstractos, sin necesidad de especificar en los mismos porque se entiende que es intrinseco, pasemos al codigo de la siguiente clase para poder probaralo:

public class PruebaAbstracta
{
        public static void main(String[] args)
        {
                Empleado e = new Empleado("Martin Miranda","M. Sosa",333);
                System.out.println("LLamada a chequeCorreo usando la "
                                + "referencia de la clase Empleado --");
                e.chequeCorreo();
        }
}
Anuncios

En este caso creamos un objeto de la clase Empleado y con la referencia de la clase Empleado, luego llamamos a chequeCorreo(), si lo compilamos obtendremos esta salida:

tinchicus@dbn001vrt:~/programacion/java/codigo$ javac PruebaAbstracta.java
PruebaAbstracta.java:5: error: Empleado is abstract; cannot be instantiated
Empleado e = new Empleado("Martin Miranda","M. Sosa",333);
^
1 error
tinchicus@dbn001vrt:~/programacion/java/codigo$
Anuncios

Este error es por lo que hablamos antes, una clase abstracta no puede ser instanciada para solucionar este error deberemos agregar la siguiente clase y hacerla heredera de Empleado:

Salario.java

public class Salario extends Empleado
{
        private double salario;

        public Salario(String nombre, String direccion, int numero,
                        double salario)
        {
                super(nombre, direccion, numero);
                setSalario(salario);
        }

        public void chequeCorreo()
        {
                System.out.println("Dentro de chequeCorreo de la clase Salario");
                System.out.println("Enviando cheque a " + getNombre()
                                + " con salario " + getSalario());
        }

        public double getSalario()
        {
                return salario;
        }

        public void setSalario(double nuevo)
        {
                if (nuevo >= 0.0)
                        salario = nuevo;
        }

        public double pagoComputado()
        {
                System.out.println("Computando el pago del salario a "
                                                + getNombre());
                return salario/52;
        }
}
Anuncios

Esta clase no solamente nos va a permitir acceder a la clase abstracta sino a su vez instanciarla por no ser abstracta pero con acceso a todos los metodos y/o variables que sean public o protected, en esta clase vamos a tener dos metodos que nos van a interesar mas, el primero es el constructor el cual se encargara de recibir los tres datos del empleado (nombre, direccion, numero) y el salario del mismo, luego por medio de super enviara los tres datos a la clase abstracta y seteara los mismos, y utilizaremos luego a setSalario() para darle el nuevo valor a salario, luego tendremos el metodo anulado de la clase abstracta llamado chequeCorreo() donde modificaremos las instucciones del mismo, recuerden al sobreescribir un metodo lo unico que cambia son las instrucciones dentro del bloque el resto (nombre y argumentos) debe permanecer igual, y despues tendremos varios metodos para obtener el salario y el pago computado, getNombre() es un metodo heredado de la clase Empleado, ahora pasemos a modificar nuevamente a PruebaAbstracta.java de la siguiente forma:

public class PruebaAbstracta
{
        public static void main(String[] args)
        {
                Empleado e = new Salario("Martin Miranda","M. Sosa",333,100000.0);
                Salario s = new Salario("Enzo Tortore", "Gral. Paz", 777, 90000.0);
                System.out.println("LLamada a chequeCorreo usando la "
                                + "referencia de la clase Empleado --");
                e.chequeCorreo();

                System.out.println("Llamada a chequeCorreo usando la "
                                + "referencia de la clase Salario --");
                s.chequeCorreo();
        }
}
Anuncios

En este caso crearemos dos empleados, uno con referencia a la clase Empleado y otro con la clase Salario pero en lugar crearlos los objetos en base a la clase abstracta Empleado lo haremos con la clase heredera Salario, en este cargaremos los cuatro datos que necesita Salario luego mostraremos un mensaje y llamaremos a chequeCorreo() para ambos empleados, si lo compilamos y ejecutamos veremos el siguiente resultado:

tinchicus@dbn001vrt:~/programacion/java/codigo$ java PruebaAbstracta
Construyendo un empleado
LLamada a chequeCorreo usando la referencia de la clase Empleado --
Dentro de chequeCorreo de la clase Salario
Enviando cheque a Martin Miranda con salario 100000.0
Construyendo un empleado
Llamada a chequeCorreo usando la referencia de la clase Salario --
Dentro de chequeCorreo de la clase Salario
Enviando cheque a Enzo Tortore con salario 90000.0
tinchicus@dbn001vrt:~/programacion/java/codigo$
Anuncios

En este caso funciono porque el objeto creado pudo instanciar Salario que no es abstracto pero si tiene acceso a esta, permitiendo acceder a todos los metodos y ejecutar nuestro programa correctamente, pasemos a la siguiente parte.

Anuncios

Metodos Abstractos

Los metodos abstractos son implementados cuando nosotros necesitamos que el metodo sea implemetando por una de las clases hijas o herederas de nuestra clase, por eso la declaramos como abstracta (es decir solo el tipo y nombre sin un cuerpo como vimos antes), veamos algunas propiedades:

  • Se usa la palabra abstract para declarar al metodo abstracto
  • La palabra abstract siempre debe estar adelante del nombre de metodo, puede estar adelante del modificador o el tipo pero siempre delante del nombre del metodo
  • El metodo abstracto siempre contiene un metodo de firma (prototipo) pero nunca un cuerpo
  • Los metodos abstractos siempre llevan un punto y coma al final (;) y nunca llevan llaves ({})
Anuncios

Para entender el concepto de metodo abstracto tomemos como ejemplo el metodo pagoComputado() y cambiemoslo a abstracto, para ello modificaremos el metodo actual de la clase Empleado.java

public double pagoComputado()
{
       System.out.println("Dentro del pago computado al empleado");
       return 0.0;
}

Por la siguiente forma:

public abstract double pagoComputado();

Esta modificacion nos traera dos consecuencias:

  • La clase contenedora debe ser declarada como abstracta, aunque en nuestro caso ya era.
  • Todo clase heredera de esta debe redefinida el metodo declarado como abstracto.
Anuncios

Recuerden que cualquiera clase heredera debe redefinir el metodo abstracto, de lo contrario tendras una jerarquia de clases abstractas que no se podra instanciar. En nuestro caso solo debio hacerse una modificacion porque nuestro metodo abstracto estaba redefinido en su clase heredera.

Anuncios

En resumen, hoy hemos visto abstraccion, para que sirve, cual es su funcion, las clases abstractas, como se deben implementar, los metodos abstractos, como son y como se deben implementar, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00