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
abstracty 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 | Sí |
| Herencia | Sí (extends) + Implementación (implements) |
Solo Implementación (implements) |
Sí (extends) |
| Métodos | Concretos y abstractos | Solo abstractos (sin cuerpo) | Solo concretos |
| Propiedades | Sí | No | Sí |
| Herencia múltiple | No | Sí | 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.