sábado, 25 de mayo de 2013

Clases Abstractas

En la entrada sobre conceptos básicos hablamos un poco sobre el termino de Abstracción y en general del como se aplica en el campo de la programación.

En esta ocasión vamos a trabajar un poco mas en detalle sobre este concepto de forma rápida y sencilla, veremos la importancia del mismo y su aplicación.

Como se ha mencionado, la abstracción permite resaltar lo mas representativo de algo sin importar los detalles.

Bueno, continuando Básicamente una clase Abstracta es similar a una clase normal (como la vimos en la entrada anterior), la estructura es prácticamente igual, ya que poseen nombre, atributos y métodos pero para que una clase sea abstracta la condición es que al menos uno de sus métodos sea abstracto (se le agrega la palabra reservada abstract y no se especifica el cuerpo del método).................su uso depende de la aplicación del concepto de Herencia y adicionaremos a la estructura básica de clase la palabra reservada abstract

Veamos como se implementa en Java.

public abstract class Principal{

    /**Método concreto con implementación*/
    public void metodoConcreto(){
       ...............
       ............... 
    }

    /**Método Abstracto sin implementación*/
    public abstract void metodoAbstracto();
  
}

class subClase extends Principal{

 @Override
 public void metodoAbstracto() {
  /**Implementación definida por la clase concreta*/
 }
 
}


Caracteristicas de una Clase Abstracta.

Esto es lo que debemos conocer sobre de Clases Abstractas.

  • Una clase Abstracta No puede ser instanciada (no se pueden crear objetos directamente - new ), solo puede ser heredada. 
  • Si al menos un método de la clase es abstract, esto obliga a que la clase completa sea definida abstract, sin embargo la clase puede tener el resto de métodos no abstractos.
  • Los métodos abstract no llevan cuerpo (no llevan los caracteres {}). 
  • La primer subclase concreta que herede de una clase abstract debe implementar todos los métodos de la superclase.

¿Cuando Utilizarlas?.

Al trabajar clases y métodos abstractos, no solo mantenemos nuestra aplicación mas organizada y fácil de entender sino que también al no poder instanciar una clase abstracta nos aseguramos de que las propiedades especificas de esta, solo estén disponibles para sus clases hijas....

Con las Clases Abstractas lo que hacemos es definir un proceso general que luego sera implementado por las clases concretas que hereden dichas funcionalidades..........¿Que?........... es decir, si tengo una clase que hereda de otra Abstracta, estoy obligado a poner en el código, todos los métodos abstractos de la clase padre, pero esta vez serán métodos concretos y su funcionalidad o cuerpo sera definido dependiendo de para que la necesite, de esa manera si tengo otra clase que también hereda del mismo padre, implementaré el mismo método pero con un comportamiento distinto..........Veamos un Ejemplo.



En el diagrama vemos una clase Abstracta Instrumento, la cual posee una propiedad tipo y un método abstracto tocar(), vemos también las clases hijas Guitarra, Saxofon y Violin que para este ejemplo solo utilizaremos (mediante la herencia) las propiedades de la clase Padre.

Todos los instrumentos musicales se pueden tocar, por ello creamos este método abstracto, ya que es un proceso común en todos los instrumentos sin importar el detalle de como se tocan, pues sabemos que una guitarra no se toca de la misma manera que el saxofón, así al heredar de la clase Instrumento, todas sus clases hijas están obligadas a implementar este método y darle la funcionalidad que le corresponda...

veamos esto en Java.
/**
 * Clase Abstracta Instrumento
 */
abstract class Instrumento{ 
 
 public String tipo;
 
 public abstract void tocar();
}

/**
 * Clase Concreta Guitarra, hija de Instrumento
 */
class Guitarra extends Instrumento {

 public Guitarra(){
  tipo="Guitarra";
 }
 
 public void tocar() {
  System.out.println("Tocar La Guitarra");
 }
}

/**
 * Clase Concreta Violin, hija de Instrumento
 */
class Violin extends Instrumento {

 public Violin(){
  tipo="Violin";
 }
 
 public void tocar() {
  System.out.println("Tocar El violin");
 }
}

/**
 * Clase Concreta Saxofon, hija de Instrumento
 */
class Saxofon extends Instrumento {

 public Saxofon(){
  tipo="Saxofon";
 }
 
 public void tocar() {
  System.out.println("Tocar el Saxofon");
 }
}

public class Principal {
 
 public static void main(String arg[]){
  /**Objeto miGuitarra de tipo Instrumento */
  Instrumento miGuitarra= new Guitarra();
  System.out.println("Instrumento : "+miGuitarra.tipo);
  miGuitarra.tocar();
  System.out.println();
  /**Objeto miSaxofon de tipo Instrumento */
  Instrumento miSaxofon= new Saxofon();
  System.out.println("Instrumento : "+miSaxofon.tipo);
  miSaxofon.tocar();
  System.out.println();
  /**Objeto miViolin de tipo Instrumento */
  Instrumento miViolin= new Violin();
  System.out.println("Instrumento : "+miViolin.tipo);
  miViolin.tocar();
  
 }

}
Como vemos cada una de las clases concretas implementan el método tocar() y le dan la funcionalidad dependiendo de como se toque el instrumento, también en cada constructor de las clases definimos el tipo, pero si nos fijamos bien en las clases concretas no tenemos la variable tipo declarada, pues estamos usando la variable heredada de la clase Instrumento.


Hay que tener en cuenta que cuando trabajamos con clases Abstractas, estas solo pueden ser heredadas mas no instanciadas, esto quiere decir que no podemos crear objetos directamente de estas clases.

Como vemos en la clase Principal tenemos la lógica para ejecutar nuestra aplicación y usamos el concepto de Polimorfismo para crear los objetos de tipo Instrumento por medio de sus clases Hijas, pero en ningún momento creamos un objeto como instancia directa de la clase abstracta......

Y listo, ya aplicamos de manera simple el concepto de Abstracción, en la próxima entrada veremos que son las Interfaces y mas adelante veremos como funciona el Polimorfismo mediante otro ejemplo de programación........

Tambièn les comparto este video con la explicaciòn teorica del concepto...


y este otro con un ejemplo practico que puede complementar lo explicado en esta entrada...




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 ;)

18 comentarios:

  1. oye, saludos primeramente, gracias por compartir tus conocimientos, podrias colocar, un curso desde cero de java, por favor!! =)

    ResponderEliminar
    Respuestas
    1. Hola, inicié uno en youtube aunq ando un poco apretado de tiempo, espero mas adelante retomarlo

      Eliminar
  2. Hola gracias, y un curso desde cero es un poquito complicado en estos momentos pero si he tenido ganas de hacerlo, sin embargo mientras tanto cualquier duda que tengas me la haces saber y miramos como te puedo ayudar ;)

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. 1. Que es una clase abstracta
    2. Cual o cuales son las condiciones para que una clase sea abstracta
    3. Que son metodos abstractos
    4. Que pasa si dentro de una clase hay 5 métodos implementados y 1 no implementado
    5. Que ocurre cuando se hereda de una clase abstracta
    6. Si no se implementan los métodos en el hijo que pasa con la clase hija
    7. Se puede instan-ciar de una clase abstracta
    8. Cual es la diferencia entre una clase abstracta y una clase normal
    9. Cual es la dferencia entre un metodo abstracto y uno no abstracto

    ResponderEliminar
    Respuestas
    1. Hola.... no se si sean preguntas que te pusieron y buscas ayuda o si son puntos que no están claros en la entrada (aunque la mayoría están explicados)... hubiera sido bueno que contextualizaras tu comentario............ un saludo ;)

      Eliminar
  5. Muchas Gracias amigo e utilizado l aprendido aqui pero crees que podrias ayudarme en darme ideas para crear otros metodos ademas de tocar o si bien fuese otras propiedades de cada instrumento algo unico solo pido algunos ejemplos. como ser numero de cuerdas si se tratase de un instrumento de cuerda

    ResponderEliminar
  6. Muchisimas gracias por compartir tus conocimientos, tu blog es genial.

    ResponderEliminar
  7. Muchas gracias por la explicación y el ejemplo, clarisimo el concepto de clases abstractas

    ResponderEliminar
  8. Hermano Muchisimas Gracias el concepto superclaro.. Saludos desde Barranquilla

    ResponderEliminar
  9. me pueden responder cual es la importancia de las clases abstractas

    ResponderEliminar
  10. Acabo de leer tu artículo y me gusta cómo lo explicas. Soy de C# pero me sirve igual. Muchas gracias.

    ResponderEliminar
  11. Cuando creas objetos del tipo Instrumento ya sea guitarra u otro, no se pueden usar los métodos que se implementan en la clase hija

    No sería mejor crearlo de esta manera:

    Guitarra miguitarra = new Guitarra();

    Es solo una duda, espero me lo aclares, gracias, buen artículo mi amigo.

    ResponderEliminar
  12. soy nuevo en esto pero quisiera saber que son los métodos concretos..??

    ResponderEliminar
    Respuestas
    1. Los metodos concretos son la implementacion en si de un metodo abstracto. Al heredar de una clase abstracta, todos sus metodos abstractos (los declarados abstract y por tanto no tienen cuerpo ni codigo) hay que implementarlos (@Override). Estos metodos implementados con su propio codigo son metodos concretos ya que pertenecen a una clase concreta (lo contrario a abstracta hablando en plata)

      Eliminar
  13. Muy bien explicado, he mirado varios sitios pero con el tuyo me ha quedado mas que claro. Tengo una duda que ya han preguntado por aquí pero no han respondido, espero que haya suerte.

    Cuando creas objetos del tipo Instrumento ya sea guitarra u otro, no se pueden usar los métodos que se implementan en la clase hija

    No sería mejor crearlo de esta manera:

    Guitarra miguitarra = new Guitarra();

    Espero que puedan resolverme esta duda, muchas gracias.

    ResponderEliminar
  14. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  15. Solo quiero felicitarte por tu excelente trabajo y hablo de este tema y muchos que te he leído. saludos

    ResponderEliminar

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