Php orientado a objetos, parte 7: Clases abstractas y finales

En el post pasado Php orientado a objetos, parte 6: Herencia vimos cómo hereda una clase de otra, lo que permite a la clase hija obtener las mismas propiedades y métodos de la clase madre, y así evitar escribir nuevamente las mismas. Pero hay algo que no expliqué con respecto a la herencia.

Nosotros teníamos una clase con este aspecto:

<?php
 class Vehiculo {
    protected $motor_encendido = false;
    protected $cantidad_de_puertas;
    protected $cantidad_de_ruedas;
    protected $marca;
    protected function __construct($cantidad_de_puertas, $cantidad_de_ruedas, $marca) {
       $this->cantidad_de_puertas = $cantidad_de_puertas;
       $this->cantidad_de_ruedas = $cantidad_de_ruedas;
       $this->marca = $marca;
    }
    public function encenderMotor(){
       $this->motor_encendido = true;
    }
    public function apagarMotor(){
       $this->motor_encendido = false;
    }
    //Verifica si el motor está encendido para saber si el auto puede arrancar o no.
    public function arrancar(){
       return $this->motor_encendido;
    } 
 } 
?>

De donde otras dos clases, Auto y Moto heredaban y obtenían todas las propiedades y métodos de esta clase Vechiculo. Sin embargo si nos ponemos a pensar, tener clases para crear objetos basados en un auto o una moto tiene lógica, porque estamos hablando de cosas concretas, que existen. Yo puedo decir: «tengo un auto» o «tengo una moto», pero no puedo decir: «tengo un vehículo» o mejor dicho, debo aclarar qué vehículo es. Por tanto si bien la clase Vehiculo debería crearse para que otras clases hereden de ahí, no debería darse la posibilidad de crearse objetos basados en una clase Vehiculo.

Para ello existen las clases abstractas. Una clase abstracta no permite crear instancias de objetos basados en la misma. Para lograr esto sólo tenemos que agregar la palabra abstract antes de class, de esta forma:

<?php
 abstract class Vehiculo {
    protected $motor_encendido = false;
    protected $cantidad_de_puertas;
    protected $cantidad_de_ruedas;
    protected $marca;
    protected function __construct($cantidad_de_puertas, $cantidad_de_ruedas, $marca) {
       $this->cantidad_de_puertas = $cantidad_de_puertas;
       $this->cantidad_de_ruedas = $cantidad_de_ruedas;
       $this->marca = $marca;
    }
    public function encenderMotor(){
       $this->motor_encendido = true;
    }
    public function apagarMotor(){
       $this->motor_encendido = false;
    }
    //Verifica si el motor está encendido para saber si el auto puede arrancar o no.
    public function arrancar(){
       return $this->motor_encendido;
    } 
 } 
?>

De esta forma no podrán crearse objetos basados en la clase Vehiculo, pero sí basados en la clase Auto y Moto, debido a que estas clases no son abstractas. Si intentamos crear un objeto nos tirará un error.

En el caso de que lo que queramos es que una clase no tenga herencia, osea que ninguna clase pueda heredar sus métodos debemos agregar la palabra reservada final.

final class MiClase {}

Saludos!

Anterior: Php orientado a objetos, parte 6: Herencia

Siguiente: Php orientado a objetos, parte 8: Propiedades y métodos estáticos


2 Respuestas a “Php orientado a objetos, parte 7: Clases abstractas y finales”

  1. Primero que todo, muchas gracias por darte el tiempo de explicar esto, de verdad que lo haces parecer muy fácil, Bueno ahora mi consulta, Si bien al anteponer «abstract» en la clase, en el ejemplo seria la clase Vehiculo, estamos bloqueando la posibilidad de crear objetos basados en esta clase. Ahora no sera suficiente con tener «protect» las variables y el constructor, ya que asi tampoco pueden crear un objeto de este. O al agregar el «abstract» a la clase nos entrega mas seguridad de que solo tengamos las variables y el constructor?.

    Gracias.
    Saludos

    1. No, es que justamente las clases abstractas son aquellas que no debería servir para crear objetos. Normalmente son clases que tienen métodos que les sirven a otras clases que heredan de la misma.

      Saludos!