Polimorfismo

Polimorfismo é um dos princípios fundamentais da programação orientada a objetos. Refere-se à capacidade de um objeto ou função se comportar de maneiras diferentes com base no contexto em que é usado. Em outras palavras, objetos de diferentes classes podem ser tratados como objetos da mesma classe base em programação orientada a objetos.

Em JavaScript, o polimorfismo é facilitado devido à sua natureza dinâmica e ao uso de protótipos. Vou mostrar um exemplo simples usando JavaScript:

class Animal {
    fazerBarulho() {
        console.log("Barulho genérico de animal");
    }
}

class Cachorro extends Animal {
    fazerBarulho() {
        console.log("Latido de cachorro");
    }
}

class Gato extends Animal {
    fazerBarulho() {
        console.log("Miado de gato");
    }
}

function fazerBarulhoDoAnimal(animal) {
    animal.fazerBarulho();
}

let cachorro = new Cachorro();
let gato = new Gato();

fazerBarulhoDoAnimal(cachorro); // Saída: "Latido de cachorro"
fazerBarulhoDoAnimal(gato); // Saída: "Miado de gato"

Neste exemplo, temos três classes: Animal, Cachorro, e Gato. Ambas Cachorro e Gato estendem a classe Animal. O método fazerBarulhoDoAnimal aceita um objeto Animal como parâmetro e chama fazerBarulho do objeto passado. Quando você passa um objeto Cachorro, ele chama o método fazerBarulho da classe Cachorro, e o mesmo vale para Gato.

O polimorfismo permite que você escreva código que funcione com objetos de uma classe base (Animal, neste caso) e, ao mesmo tempo, seja capaz de lidar com objetos derivados (Cachorro, Gato, etc.) sem saber qual objeto específico está sendo tratado. Isso promove a reutilização de código e flexibilidade no design de software.