¿Qué es el polimorfismo?
Parte de la sección Programación Orientada a Objetos del Journey de JavaScript de Coddy — lección 35 de 56.
El polimorfismo es un principio fundamental de la programación orientada a objetos que permite que objetos de diferentes clases respondan al mismo método de diferentes maneras.
En JavaScript, el polimorfismo se ve más comúnmente cuando las clases hijas sobrescriben métodos de las clases padres.
Vamos a crear una clase padre simple con un método speak():
class Animal {
constructor(name) {
this.name = name;
}
speak() {
return `${this.name} makes a sound`;
}
}Ahora, vamos a crear una clase hija que extiende a Animal:
class Dog extends Animal {
speak() {
return `${this.name} barks`;
}
}Aquí tienes otra clase hija:
class Cat extends Animal {
speak() {
return `${this.name} meows`;
}
}Cada clase hija implementa el método speak() de manera diferente. ¡Esto es polimorfismo en acción!
Ahora podemos crear diferentes objetos y llamar al mismo método en cada uno:
const animal = new Animal("Some animal");
const dog = new Dog("Rex");
const cat = new Cat("Whiskers");
console.log(animal.speak()); // Some animal hace un sonido
console.log(dog.speak()); // Rex ladra
console.log(cat.speak()); // Whiskers maúllaLos tres objetos responden al método speak(), pero cada uno lo hace a su propia manera.
Desafío
Tienes un sistema de notificaciones con una clase padre Notification y dos clases hijas. Tu tarea es añadir el método send(message) a cada clase hija con diferentes implementaciones.
- En la clase
EmailNotification, el método debe devolver el string: "Sending '(message)' via Email" - En la clase
SMSNotification, el método debe devolver el string: "Sending '(message)' via SMS"
Hoja de referencia
El polimorfismo permite que objetos de diferentes clases respondan al mismo método de diferentes maneras. En JavaScript, esto se logra comúnmente cuando las clases hijas sobrescriben métodos de las clases padres.
Crea una clase padre con un método:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
return `${this.name} makes a sound`;
}
}Las clases hijas pueden sobrescribir el método del padre con su propia implementación:
class Dog extends Animal {
speak() {
return `${this.name} barks`;
}
}
class Cat extends Animal {
speak() {
return `${this.name} meows`;
}
}Cada objeto responde al mismo método de manera diferente:
const animal = new Animal("Some animal");
const dog = new Dog("Rex");
const cat = new Cat("Whiskers");
console.log(animal.speak()); // Some animal makes a sound
console.log(dog.speak()); // Rex barks
console.log(cat.speak()); // Whiskers meowsPruébalo tú mismo
import { EmailNotification } from './email-notification.js';
import { SMSNotification } from './sms-notification.js';
// Código de prueba - no modificar
const email = new EmailNotification();
const sms = new SMSNotification();
console.log(email.send("Hello!")); // Debería usar el send() de EmailNotification
console.log(sms.send("Hello!")); // Debería usar el send() de SMSNotificationEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Objetos y la palabra clave this
Repaso rápido: ObjetosAgregar métodos a los objetosEntendiendo la palabra clave thisFunciones constructorasLa palabra clave newDesafío de repaso7Herencia y la palabra clave extends
HerenciaLa relación "es-un"La palabra clave extendsEl método super()Heredar propiedades y métodosDesafío de repaso13Composición vs. Herencia
La relación "tiene-un" vs. "es-un"Los límites de la herencia profundaConstrucción de objetos2Organización del código
¿Qué son los módulos?Exportar con exportImportar con importExportaciones por defecto vs. nombradas5Encapsulamiento y Acceso
EncapsulamientoCampos de clase públicos y privadosMétodos privadosDesafío de repaso8Organización del código OOP
Organizar clases en módulos11Proyecto: Un renderizador de figuras
Configuración: Clase Figura y exportaciónHerencia de la clase Círculo14Sistema de Gestión de Biblioteca
Diseño de la BibliotecaClase Libro con Composición9Métodos y propiedades estáticos
Nivel de clase vs. Nivel de instanciaPropiedades estáticasMétodos de utilidad estáticosDesafío de repaso