Menu
Coddy logo textTech

O que é Polimorfismo?

Parte da seção Programação Orientada a Objetos do Journey de JavaScript da Coddy — lição 35 de 56.

O polimorfismo é um princípio fundamental da programação orientada a objetos que permite que objetos de diferentes classes respondam ao mesmo método de diferentes maneiras.

Em JavaScript, o polimorfismo é mais comumente visto quando classes filhas sobrescrevem métodos de classes pai.

Vamos criar uma classe pai simples com um método speak():

class Animal {
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    return `${this.name} makes a sound`;
  }
}

Agora, vamos criar uma classe filha que estende Animal:

class Dog extends Animal {
  speak() {
    return `${this.name} barks`;
  }
}

Aqui está outra classe filha:

class Cat extends Animal {
  speak() {
    return `${this.name} meows`;
  }
}

Cada classe filha implementa o método speak() de forma diferente. Isso é polimorfismo em ação!

Agora podemos criar diferentes objetos e chamar o mesmo método em cada um:

const animal = new Animal("Some animal");
const dog = new Dog("Rex");
const cat = new Cat("Whiskers");

console.log(animal.speak()); // Some animal faz um som
console.log(dog.speak());    // Rex late
console.log(cat.speak());    // Whiskers mia

Todos os três objetos respondem ao método speak(), mas cada um o faz de sua própria maneira.

challenge icon

Desafio

Você tem um sistema de notificação com uma classe pai Notification e duas classes filhas. Sua tarefa é adicionar o método send(message) a cada classe filha com implementações diferentes.

  1. Na classe EmailNotification, o método deve retornar a string: "Sending '(message)' via Email"
  2. Na classe SMSNotification, o método deve retornar a string: "Sending '(message)' via SMS"

Folha de consulta

O polimorfismo permite que objetos de diferentes classes respondam ao mesmo método de maneiras diferentes. No JavaScript, isso é comumente alcançado quando as classes filhas sobrescrevem métodos das classes pais.

Crie uma classe pai com um método:

class Animal {
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    return `${this.name} makes a sound`;
  }
}

As classes filhas podem sobrescrever o método pai com sua própria implementação:

class Dog extends Animal {
  speak() {
    return `${this.name} barks`;
  }
}

class Cat extends Animal {
  speak() {
    return `${this.name} meows`;
  }
}

Cada objeto responde ao mesmo método de forma diferente:

const animal = new Animal("Some animal");
const dog = new Dog("Rex");
const cat = new Cat("Whiskers");

console.log(animal.speak()); // Algum animal faz um som
console.log(dog.speak());    // Rex late
console.log(cat.speak());    // Whiskers mia

Experimente você mesmo

import { EmailNotification } from './email-notification.js';
import { SMSNotification } from './sms-notification.js';

// Código de teste - não modifique
const email = new EmailNotification();
const sms = new SMSNotification();

console.log(email.send("Hello!"));  // Deve usar o send() do EmailNotification
console.log(sms.send("Hello!"));    // Deve usar o send() do SMSNotification
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos