Saltar la navegación

1.5.2.- Herencia (II).

Imagen de un diagrama de clases, la clase producto arriba, abajo a la izquierda la clase TV y abajo a la derecha la clase PC, de las clases inferores sale un flecla hacia la clase producto.
Captura de pantalla BlueJ (Elaboración Propia)

Vamos a hacer una pequeña modificación en nuestra clase Producto. Para facilitar la creación de nuevos objetos, crearemos un constructor al que se le pasará un array con los valores de los atributos del nuevo producto.

class Producto {
    public $codigo;
    public $nombre;
    public $nombre_corto;
    public $pvp;
    public function __construct($row) {
        $this->codigo = $row['cod'];
        $this->nombre = $row['nombre'];
        $this->nombre_corto = $row['nombre_corto'];
        $this->PVP = $row['pvp'];
    }
    public function muestra() {
        echo "<p>" . $this->codigo . "</p>";
    }
}

¿Qué pasa ahora con la clase TV, qué hereda de Producto? Cuando crees un nuevo objeto de esa clase, ¿se llamará al constructor de Producto? ¿Puedes crear un nuevo constructor específico para TV que redefina el comportamiento de la clase base?

Empezando por esta última pregunta, obviamente puedes definir un nuevo constructor para las clases heredadas que redefinan el comportamiento del que existe en la clase base, tal y como harías con cualquier otro método. Y dependiendo de si programas o no el constructor en la clase heredada, se llamará o no automáticamente al constructor de la clase base.

En PHP, si la clase heredada no tiene constructor propio, se llamará automáticamente al constructor de la clase base (si existe). Sin embargo, si la clase heredada define su propio constructor, deberás ser tú el que realice la llamada al constructor de la clase base si lo consideras necesario, utilizando para ello la palabra parent y el operador de resolución de ámbito.

class TV extends Producto {
    public $pulgadas;
    public $tecnologia;
    public function __construct($row) {
        parent::__construct($row); //llama al constructor de la clase padre
        $this->pulgadas = $row['pulgadas'];
        $this->tecnologia = $row['tecnologia'];
    }
    public function muestra() {
        echo "<p>" . $this->pulgadas . " pulgadas</p>";
    }
}

Ya viste con anterioridad cómo se utilizaba la palabra clave self para tener acceso a la clase actual. La palabra parent es similar. Al utilizar parent haces referencia a la clase base de la actual, tal y como aparece tras extends.

Autoevaluación

Pregunta

Si una subclase no tiene método constructor, y su clase base sí lo tiene, cuando se instancie un nuevo objeto de la subclase:

Respuestas

Se llamará automáticamente al constructor de la clase base.

No se llamará automáticamente al constructor de la clase base.

Retroalimentación