Sobes.tech
Junior

¿Cuál es la esencia de una clase abstracta?

sobes.tech AI

Respuesta de la IA

La esencia de una clase abstracta es servir como plantilla para otras clases. No puede ser creada directamente, pero puede contener métodos abstractos (sin cuerpo), que deben ser implementados en las clases hijas, así como métodos y propiedades concretas.

Puntos clave:

  • No se puede crear una instancia: new ClaseAbstracta() causará un error.
  • Herencia: Solo se puede heredar de una clase abstracta (extends).
  • Métodos abstractos: Definen la interfaz que deben implementar las clases hijas. Se marcan con la palabra clave abstract y no tienen cuerpo.
  • Métodos y propiedades concretas: Pueden ser definidas y utilizadas directamente, así como sobrescritas en las clases hijas.
  • Implementación parcial: Proporciona una estructura general y cierta funcionalidad básica, dejando los detalles de implementación a criterio de las clases hijas.

Ejemplo:

<?php

abstract class Figura {
    protected $color;

    public function __construct($color) {
        $this->color = $color;
    }

    abstract public function calcularArea(); // Método abstracto

    public function obtenerColor() {
        return $this->color;
    }
}

class Circulo extends Figura {
    private $radio;

    public function __construct($color, $radio) {
        parent::__construct($color);
        $this->radio = $radio;
    }

    public function calcularArea() {
        return pi() * $this->radio * $this->radio;
    }
}

class Cuadrado extends Figura {
    private $lado;

    public function __construct($color, $lado) {
        parent::__construct($color);
        $this->lado = $lado;
    }

    public function calcularArea() {
        return $this->lado * $this->lado;
    }
}

// Ejemplo de uso
$circulo = new Circulo("Rojo", 5);
echo "Área del círculo: " . $circulo->calcularArea() . ", Color: " . $circulo->obtenerColor() . "\n";

$cuadrado = new Cuadrado("Azul", 4);
echo "Área del cuadrado: " . $cuadrado->calcularArea() . ", Color: " . $cuadrado->obtenerColor() . "\n";

// El siguiente código causará un error Fatal: Instanciando una clase abstracta
// $figuraAbstracta = new Figura("Desconocido");

Tabla comparativa con interfaces y clases normales:

Característica Clase abstracta Interfaz Clase normal
Creación de instancia No No
Herencia Sí (extends) + Implementación (implements) Solo Implementación (implements) Sí (extends)
Métodos Concretos y abstractos Solo abstractos (sin cuerpo) Solo concretos
Propiedades No
Herencia múltiple No No
Propósito Implementación parcial, estructura general Definición de contrato (comportamiento) Implementación completa, objeto concreto

Se usa cuando hay lógica y propiedades comunes que deben tener un grupo de clases relacionadas, pero su comportamiento específico (implementación de algunos métodos) varía. Permite reutilización múltiple del código y coherencia en la estructura de las clases.