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

Inicio / Misceláneos / ¿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

CEO at Leeway
Mauro es Lic. en Ciencias de la Computación.
Su carrera como docente de programación se inició en el año 1997 en la Escuela Técnica ORT.
Actualmente coordina el desarrollo de proyectos web en Leeway y los cursos dictados en la Leeway Academy

Deja un comentario

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