Polimorfismo

O polimorfismo em TypeScript possibilita que diferentes classes respondam de formas distintas à mesma interface ou método, aumentando a flexibilidade do código. Esse conceito é central na orientação a objetos e ocorre principalmente por meio de herança (com sobrescrita de métodos) e interfaces, permitindo que funções e algoritmos operem sobre diferentes tipos relacionados de maneira uniforme.

O que é Polimorfismo?

  • Permite que métodos de mesmo nome, definidos numa superclasse ou interface, sejam implementados de formas diferentes em subclasses.
  • Um objeto de uma superclasse pode ser referenciado por instâncias de qualquer subclasse, e a chamada a métodos polimórficos resultará no comportamento da respectiva subclasse.

Exemplo com Herança: Sobrescrita de Métodos

class Funcionario {
nome: string;
constructor(nome: string) {
this.nome = nome;
}
calcularSalario(): number {
return 1000;
}
}

class Gerente extends Funcionario {
calcularSalario(): number {
return 3000; // implementação diferente para gerente
}
}

class Programador extends Funcionario {
calcularSalario(): number {
return 2000;
}
}

const equipe: Funcionario[] = [
new Gerente("Maria"),
new Programador("Carlos"),
new Programador("Ana")
];

equipe.forEach(f =>
console.log(`${f.nome}: ${f.calcularSalario()}€`)
);
// Maria: 3000€
// Carlos: 2000€
// Ana: 2000€

Cada objeto responde à chamada de calcularSalario de acordo com sua classe específica (polimorfismo por sobrescrita).

Usando Interfaces para Polimorfismo

Interfaces definem contratos e permitem que funções operem sobre tipos diferentes, mas compatíveis:

interface Forma {
area(): number;
}

class Quadrado implements Forma {
constructor(public lado: number) {}
area(): number {
return this.lado * this.lado;
}
}

class Circulo implements Forma {
constructor(public raio: number) {}
area(): number {
return Math.PI * this.raio * this.raio;
}
}

const formas: Forma[] = [
new Quadrado(4),
new Circulo(2)
];

formas.forEach(f => console.log(f.area()));
// 16
// 12.566370614359172

Diversas implementações de area() atendem o mesmo contrato Forma, demonstrando polimorfismo por interface.

Polimorfismo Paramétrico (Generics)

TypeScript permite criar funções polimórficas por tipo, chamadas de generics:

typescriptfunction imprimirArray<T>(arr: T[]): void {
  arr.forEach(item => console.log(item));
}

imprimirArray<number>([10, 20, 30]);
imprimirArray<string>(["a", "b", "c"]);

A função imprimirArray opera polimorficamente para qualquer tipo de array, mantendo a segurança de tipos.

Benefícios do Polimorfismo

  • Flexibilidade: aceita vários tipos compatíveis.
  • Reutilização: funções e algoritmos genéricos.
  • Manutenção: fácil extensão do sistema sem alterar algoritmos existentes.

O polimorfismo torna o código mais desacoplado e preparado para mudanças e expansão, sendo fundamental na arquitetura orientada a objetos.

Se desejar, podem ser apresentados exercícios sobre identificação ou implementação de polimorfismo usando classes, interfaces ou generics.