Herencia
Mecanismo mediante el cual una clase hija adquiere las propiedades y métodos de una clase padre usando extends y super.
Herencia
La palabra clave extends es el mecanismo que activa la herencia en la Programación Orientada a Objetos. Significa que una clase tomará todo lo que tiene la otra clase y se extenderá a partir de ahí.
La clase hija hereda todo lo que tiene la clase padre (sus propiedades y métodos), pero además puede agregar características y comportamientos propios.
Sintaxis Básica
typescriptclass ClasePadre {
// Propiedades y métodos generales
}
// 'extends' conecta a la hija con el padre
class ClaseHija extends ClasePadre {
// Hereda todo lo de ClasePadre + lo que agregues aquí
}
Uso de extends
1. Sin constructor propio en la clase hija
Si la clase hija no necesita propiedades nuevas en su propio constructor, hereda directamente el constructor y los métodos del padre.
typescript// 1. CLASE PADRE
class Animal {
constructor(public nombre: string) {}
comer(): void {
console.log(`${this.nombre} está comiendo.`);
}
}
// 2. CLASE HIJA (Usa extends)
class Perro extends Animal {
ladrar(): void {
console.log("¡Guau! ¡Guau!");
}
}
// --- USO DE EXTENDS ---
const miPerro = new Perro("Firulais");
// Usa el constructor y el método heredados de Animal:
console.log(miPerro.nombre); // "Firulais"
miPerro.comer(); // "Firulais está comiendo."
// Usa el método propio de Perro:
miPerro.ladrar(); // "¡Guau! ¡Guau!"
2. Agregando nuevas propiedades en la clase hija
Si la clase hija necesita sus propias propiedades, declaras su constructor y usas super() para pasarle al padre los datos que requiere.
typescript// 1. CLASE PADRE
class Vehiculo {
constructor(public marca: string) {}
arrancar(): void {
console.log(`El vehículo ${this.marca} arrancó.`);
}
}
// 2. CLASE HIJA
class Auto extends Vehiculo {
// Agregamos la propiedad propia 'puertas'
constructor(marca: string, public puertas: number) {
super(marca); // Le enviamos 'marca' al constructor de Vehiculo
}
abrirPuertas(): void {
console.log(`Abriendo las ${this.puertas} puertas del${this.marca}.`);
}
}
const miAuto = new Auto("Toyota", 4);
miAuto.arrancar(); // "El vehículo Toyota arrancó." (Heredado)
miAuto.abrirPuertas(); // "Abriendo las 4 puertas del Toyota." (Propio)
Uso de super
La palabra clave super sirve para comunicarte con la clase padre desde la clase hija. Tiene dos usos principales:
super(...)dentro del constructor: Llama al constructor del padre.super.metodo()dentro de un método: Llama a un método del padre para reutilizar su código.
1. super(...) en el Constructor
Cuando la clase hija declara su propio constructor, TypeScript exige llamar a super(...) para enviarle al padre los parámetros que necesita para inicializarse.
typescript// 1. CLASE PADRE
class Persona {
constructor(public nombre: string, public edad: number) {}
}
// 2. CLASE HIJA
class Empleado extends Persona {
// Recibimos nombre, edad Y la propiedad nueva 'salario'
constructor(nombre: string, edad: number, public salario: number) {
// ⚠️ OBLIGATORIO: Llama al constructor de Persona
super(nombre, edad);
}
}
const emp = new Empleado("Ana", 28, 3000);
console.log(emp.nombre); // "Ana" (Inicializado por el padre gracias a super)
console.log(emp.salario); // 3000 (Inicializado por el hijo)
Regla de oro: Debes ejecutar
super()antes de intentar usarthis. Si intentas acceder athisantes de llamar asuper(), TypeScript dará un error de compilación.
2. super.metodo() para Extender Funcionalidad
Usa super.nombreDelMetodo() para ejecutar la lógica base del padre y agregar posteriormente el código específico de la clase hija.
typescript// 1. CLASE PADRE
class Notificacion {
enviar(): void {
console.log("Conectando con el servidor de notificaciones...");
}
}
// 2. CLASE HIJA
class NotificacionEmail extends Notificacion {
override enviar(): void {
// 1. Ejecuta primero el método del padre
super.enviar();
// 2. Agrega la lógica específica del Email
console.log("Enviando correo electrónico...");
}
}
const email = new NotificacionEmail();
email.enviar();
// Imprime:
// "Conectando con el servidor de notificaciones..." <-- Lógica del padre (super.enviar())
// "Enviando correo electrónico..." <-- Lógica del hijo