Programación Orientada a Objetos (VIII)

En este artículo vamos a seguir dándole vueltas al concepto de métodos abstractos, al que nos asomamos en el artículo anterior, dedicado a las interfaces. Ahora que ya tenemos claro lo que es un método abstracto y cómo debe ser sobrescrito para poder usarlo, vamos a asomarnos a una variante de las interfaces que son las clases abstractas.

Una clase abstracta es cualquiera que implemente uno o más métodos abstractos, es decir, declarados pero no definidos. La clase abstracta debe declararse con el modificador abstact, y no podrá instanciarse en un objeto, del mismo modo que una interfaz tampoco puede ser instanciada. En realidad, las clases abstractas son una variante más funcional de las interfaces. También es una clase abstracta cualquiera que sea declarada como tal, incluso si no tiene métodos abstractos definidos.

Vamos a estudiar un ejemplo práctico, para aclarar este concepto, y ver cómo se usa.

LAS CLASES ABSTRACTAS

Hemos comentado que las clases abstractas son aquellas que se declaran con el modificador abstract, y que tienen, o no, métodos abstractos. En este sentido, pueden servir, al igual que las interfaces, como guías de los métodos que hay que sobrescribir en las clases que hereden de ellas. Sin embargo, el uso de clases abstractas presenta ciertas peculiaridades que debemos conocer. Voy a empezar detallando estas, para que las tengas a modo de guía:

  • Las clases abstractas no pueden ser instanciadas. No se puede crear un objeto de una clase abstracta.
  • Al ser clases, pueden contener en su definición propiedades que serán heredadas por las clases derivadas de ellas. Sin embargo, en PHP, no se pueden definir propiedades estáticas en clases abstractas. Las propiedades de clase deben ser declaradas en clases convencionales.
  • En el contexto de las clases abstractas, al contrario de lo que sucede con las interfaces, un método abstracto debe ser declarado, específicamente, con el modificador abstract.
  • Un método no abstracto declarado en una clase abstracta no funcionará correctamente en la clase derivada, pero no lanzará un error de ningún nivel (ni siquiera un warning). Por está razón, los métodos de una clase abstracta deberán ser declarados siempre como abstractos (aunque la teoría nos diga que no es necesario), y sobrescritos en la clase derivada.
  • La sobrescritura de métodos abstractos en la clase derivada sí es obligatoria (igual que en las interfaces). Sin embargo, es mucho más rígida. La declaración del método abstracto en la clase abstracta deberá tener los mismos parámetros que vaya a tener después en la clase derivada.
  • Los métodos abstractos no pueden ser declarados como private en la clase abstracta. Se deben declarar como public. Al sobrescribirlos en la clase convencional, también deben ser declarados como public.

UN EJEMPLO DE USO

Vamos a ver un ejemplo de uso de clases abstractas. En primer lugar, vemos el código de AbstractaTelevisorClass.php:

A continuación, creamos una clase convencional que hereda de la clase abstracta.

Y por último, creamos el fichero index.php, que instancia la clase convencional.

CONCLUYENDO

Esto funciona perfectamente, pero, si nos paramos a pensarlo, el uso que se le da a las clases abstractas es, realmente, el mismo que se les da a las interfaces, con limitaciones que, realmente, no aportan nada a la programación. Por esta razón, yo soy partidario, salvo casos muy específicos que puedan llegar a surgir, de que, si necesitamos una guía de métodos, nos decantemos por las interfaces, que son lo que son y para lo que son. Las clases abstractas no dejan de ser un torpe remiendo que no nos aporta nada nuevo. No obstante, forman parte de la arquitectura de PHP (y de otros lenguajes), y te las he expuesto para que las conozcas, y conozcas mi punto de vista (y el de muchos otros desarrolladores) y las razones del mismo. En este enlace te dejo los códigos para que experimentes por ti mismo y formes tu propia opinión.

   

Deja un comentario