Programação Orientada a Objetos: Polimorfismo

Se você está mergulhando no universo da Programação Orientada a Objetos (POO), provavelmente já ouviu falar de um conceito poderoso e, às vezes, um pouco intimidador: o Polimorfismo. Mas o que exatamente significa essa palavra que parece complicada?

A resposta está em sua origem: "poli" (muitas) e "morfismo" (formas). Em essência, polimorfismo é a capacidade de um objeto assumir muitas formas, ou melhor, de uma mesma ação se comportar de maneiras diferentes dependendo do contexto.

Polimorfismo é um pilar da POO que permite a realização de uma mesma tarefa de diferentes maneiras, escrevendo um código mais flexível, genérico e fácil de manter.

As Duas Faces do Polimorfismo

1. Sobrecarga (Overload)

Acontece quando temos métodos com o mesmo nome dentro da mesma classe, mas com assinaturas diferentes (parâmetros diferentes). É como ter uma mesma ferramenta com diferentes "bocais" para tarefas distintas.

2. Sobreposição (Override)

Esta é a forma mais clássica. Ocorre quando uma classe filha fornece uma implementação específica para um método que já existe em sua classe mãe. A decisão de qual método será executado acontece em tempo de execução.

Um Exemplo Prático: Formas Geométricas

Imagine que estamos criando um sistema para calcular a área de diferentes formas geométricas. Temos uma classe abstrata Forma e classes concretas como Circunferencia e Retangulo.

A classe Forma define um contrato: toda forma DEVE ter um método para calcular a área. No entanto, ela não sabe como fazer isso, pois o cálculo é diferente para cada forma.

// Superclasse Abstrata
public abstract class Forma {
    // Método abstrato que força as subclasses a implementá-lo
    public abstract double area();
}

Agora, as classes filhas sobrepõem o método area() com suas próprias regras de cálculo:

// Subclasse Circunferencia
public class Circunferencia extends Forma {
    private double raio;
    
    //... construtor
    
    @Override
    public double area() {
        return Math.PI * raio * raio;
    }
}

// Subclasse Retangulo
public class Retangulo extends Forma {
    private double base, altura;

    //... construtor

    @Override
    public double area() {
        return base * altura;
    }
}

A Mágica do Polimorfismo em Ação

O grande poder aparece quando usamos uma referência da superclasse (Forma) para apontar para objetos das subclasses. Podemos ter uma lista de Forma e chamar o método area() em cada item, sem nos preocuparmos com o tipo específico de cada um.

Forma minhaForma;

minhaForma = new Circunferencia(10.0);
// Chama o area() de Circunferencia
System.out.println("Área: " + minhaForma.area()); 

minhaForma = new Retangulo(5.0, 4.0);
// Chama o area() de Retangulo
System.out.println("Área: " + minhaForma.area());

Referência

Java: Guia do Programador, Peter Jandl Junior, Ed 04, 2021

Comentários

Postagens mais visitadas deste blog

LockBit 5.0: Ameaça Ransomware Retorna Mais Poderosa e Multiplataforma

Nova Diretriz de Cardiologia: Pressão 12 por 8 é Pré-Hipertensão

Nova Droga Mostra Ser 20.000 Vezes Mais Eficaz Contra Células de Câncer