Clases Abstractas En La Programación Orientada A Objetos

Clases abstractas en la programación orientada a objetos

Echa la vista atrás y mira cuantas cosas has tenido que aprender si has seguido esta serie de artículos. Si te has leído cada uno ya serás capaz de crear clases y objetos, inicializar y destruir valores con sus constructores y destructores respectivamente, habrás aprendido los diferentes tipos de datos que tenemos y su visibilidad entre otras cosas. Pues bien, en esta entrada vamos a ver qué son las clases abstractas en la programación orientada a objetos.

¿Qué son las clases abstractas?

Una clase abstracta es aquella que no se puede instancias. Si una clase posee un método abstracto por narices ha de ser abstracta también. Por lo general utilizamos las clases abstractas para definir comportamientos comunes o generales pero sin especificar como lo hacen. Es habitual que los métodos de estas clases abstractas no tengan cuerpo de declaración, es decir, solo tienen la definición del método, el nombre y la visibilidad vaya.

¿Pero esto como puede ser? Pues muy sencillo, imagínate a las clases abstractas como simples guiones o conjunto de TODOs para otras clases. En ellas se indican que tareas hay que hacer pero no cómo hacerlas y serán las clases hijas que hereden de las clases abstractas las que decidan cómo hacer esas tareas.

Por ejemplo, mi padre decide que su coche esta muy sucio y me ordena que debo lavarlo, pero no me indica como. Puedo llevarlo a un túnel de lavado, puedo darle con la manguera o puedo coger un barreño de agua, jabón y un cepillo y limpiarlo a mano, uuuff… que pereza…

Pues en este ejemplo mi padre sería la clase abstracta y sus ordenes los métodos abstractos. Cómo decida implementar yo sus ordenes (soy la clase hija) es problema mio.

Pero no solo sirven para definir comportamientos comunes, también sirven para asignar diferentes características y propiedades comunes a las clases hijas.

Vuelve a pensar en mi padre, una característica que heredaré por ser su hijo es su apellido y su tendencia a ser morenos de pelo, aquí ya entramos en genética, pero tal vez lo que no herede son sus gustos musicales, mientras que él escucha a Sabina yo puedo deleitarme con ACDC, por ejemplo…

Tan solo aquellas características y propiedades comunes que definen a un conjunto de clases jerárquicas deberán de ser heredadas, no así las propiedades exclusivas de una única clase. ¿Se entiende no?

Pues bien, con este tipo de clases hay ciertas reglas, características o normas que tenemos que tener en cuenta:

  • Si se definen métodos abstractos en una clase abstracta, todas las clases que hereden de ella han de implementar todos esos métodos.
  • Las clases abstractas si que pueden heredar de otras clases y no tienen porque ser estas abstractas también.
  • El número y tipo de datos de los argumentos de una clase abstracta han de respetarse siempre en las clases hijas.
  • Si una clases esta formada solo por métodos abstractos y constantes entonces es una interface.

En otros lenguajes de programación y no solo en PHP, las clases abstractas están muy relacionadas con el polimorfismo, pero vamos a ver qué es el polimorfismo porque tiene un nombre muy chulo pero puede liar un poquillo…

Cómo utilizar las clases abstractas con el polimorfismo

Agárrate bien los machos porque el polimorfismo junto con la encapsulación y la herencia son las tres patas fundamentales de la programación orientada a objetos, bueno y los objetos claro.

Tal y como sugiere su nombre, el polimorfismo indica muchas formas y en programación esto se puede referir a diferentes comportamientos en función del contexto en el que se este ejecutando la clase.

Pero esto es bastante abstracto, mejor si lo vemos con un ejemplo y para ello vamos a hacer una jerarquía de clases.

Tal y como ves en el ejemplo, he creado cuatro clases:

  • Una clase abstracta que representa el concepto de animal con el método moverse().
  • Una clase Gorrino que hereda de la clase Animal y que implementa el método moverse().
  • Una clase Pajarico que hereda de la clase Animal y que implementa el método moverse().
  • Una clase Acción que tiene un método andar() al que se le pasa un objeto del tipo Animal y ejecuta el método moverse().

Pues bien, hemos metido un animal de cada clase en un array y lo recorremos. Cada uno de los animales se lo pasamos a la acción para que se mueva y sus resultados son los siguientes:

// El gorrino corre
// El pajarico vuela

Vale y a lo mejor te estés preguntando por el polimorfismo y dónde se encuentra en este script. Pues se encuentra en nada mas y nada menos que en la definición del método anda() de la clase Accion. Hemos dicho que espera que le pasemos un argumento del tipo Animal y el método únicamente comprobará que lo que le pasemos herede de esa clase y le dará igual si se trata de un Gorrino o de un Pajarico.

Pues eso es el polimorfismo y ese es el uso que podemos hacer de las clases abstractas. Bueno no es el unico obviamente pero si el mas fácil de ver y explicar 😛

Si después de esto y a medida que programes eres capaz de abstraer tus programas significará que has entendido a la perfección el problema que estas tratando de resolver por lo que enhorabuena aunque no te agobies que se necesita practica y a veces es mejor dar una solución concreta que lucirte haciendo un programa to guapo pero alargando los tiempos de entrega 😉

Se que el tema es bastante difícil de ver y entender si es la primera vez que te encuentras con ello así que si necesitas mas explicaciones o ejemplos por favor pídemelos en los comentarios o en twitter a través del siguiente banner.

@gorkakatua #faqsGorkamu pregúntame por twitter cualquier cosa y vemos cómo lo solucionamos.

Hala a mamarla!

¿Te ha parecido este un artículo de 5 estrellas? Dame tu valoración:
Review Date
Reviewed Item
Clases abstractas en la programación orientada a objetos
Author Rating
5

Gorka Muñoz Andrés

Me llamo Gorka Muñoz y soy un desarrollador melómano. Combino a la perfección la búsqueda de nuevos grupos con la pasión por la tecnología. Desde chiquitito me ha gustado la programación, ahora que soy mayor estoy metido en el mundo del SEO sin olvidarme del /Dev.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *