¿Una clase abstracta siempre tiene que tener un método abstracto?

Respuesta corta: NO (Al menos en PHP).

¿Querés los detalles? Seguí leyendo…

Esta pregunta surgió en una clase de POO y me pareció interesante compartir la respuesta ya que no es realmente trivial.

El ejemplo que estábamos viendo era el siguiente:

Teníamos un sistema que manejaba clientes, con lo cual, contaba con una clase Cliente:

class Cliente
{
   private $nombre;
   private $apellido;
   private $cuit;
   private $email;

   public function __construct( $nombre, $apellido, $cuit, $email )
   {
       $this->setNombre($nombre);
       ...
   }

   public function setNombre( $nombre )
   {
      $this->nombre = $nombre;
   }

   ...
}

Pronto vimos la necesidad de especializar esta clase en tres subclases diferentes:

class PYME extends Cliente
{
}
class PersonaFisica extends Cliente
{
}
class Multinacional extends Cliente
{
}

Dado que los requerimientos del sistema quedaron más claros y era evidente que tener una única clase para modelar todos los tipos de cliente que tenía el sistema se haría sumamente engorroso.

Y ahí surgió la pregunta… la clase cliente… ¿debería ser abstracta?

Pensándolo un poco llegamos a la conclusión de que sí. No tiene sentido (dentro del contexto de este sistema) pensar en clientes que no sean de ninguna subclase específica.

Y ahí vino el dilema que dio origen a este post: ¿debería esta clase tener un método abstracto?

Como de costumbre, me gusta devolver la pregunta al público, acompañada de un rotundo: «Probémoslo».

Así que hicimos el cambio en la definición de nuestra clase cliente:

abstract class Cliente
{
   ...
}

Y sí… todo funcionó correctamente.

Ahora, si la clase Cliente no tiene ningún método abstracto… ¿vale la pena que sea abstracta?

Sí. Precisamente por lo que decíamos hace un momento: no tiene sentido (es más, sería contraproducente) tener una instancia de Cliente (a diferencia de tener una instancia de PYME, PersonaFisica o Multinacional).

Por otro lado, tener una clase Cliente que actúe como base de la jerarquía me resulta muy útil cuando necesito hacer algo como:

class Notificador
{
   private $clienteEmail;

   ...

   public function notificar( Cliente $cliente, $mensaje )
   {
       $this->getClienteEmail()->enviar( $cliente->getEmail(), $mensaje );
   }

   ...
}

De este modo, el Notificador puede enviar mensajes a cualquier tipo de cliente, aunque no conozca el tipo exacto de cliente del que se trata.

¿Alguna pregunta? ¡Espero tus comentarios!

mchojrin

Docente y consultor PHP at Leeway Academy
Ayudo a desarrolladores PHP a acelerar su llegada a Sr.

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: