Polimorfismo

El polimorfismo es un concepto fundamental en la programación orientada a objetos que te permite tratar objetos de diferentes tipos como si fueran del mismo tipo en ciertos contextos. Es como tener una caja de herramientas donde cada herramienta tiene una función específica, pero todas pueden ser utilizadas para un propósito general, como "arreglar algo".

¿Qué es el polimorfismo?

En términos simples, el polimorfismo significa "muchas formas". En la programación orientada a objetos, se refiere a la capacidad de un objeto de tomar muchas formas. Esto se logra a través de la herencia y la sobreescritura de métodos.

Tipos de polimorfismo:

  • Polimorfismo estático (compilación): Se determina en tiempo de compilación. Un ejemplo común es la sobrecarga de funciones, donde se tienen múltiples funciones con el mismo nombre pero diferentes parámetros.
  • Polimorfismo dinámico (ejecución): Se determina en tiempo de ejecución. Se logra a través de la sobreescritura de métodos en clases derivadas.

Ejemplos en diferentes lenguajes:

C++:

C++
#include <iostream>

class Animal {
public:
    virtual void hacerSonido() {
        std::cout << "El animal hace un sonido." << std::endl;
    }
};

class Perro : public Animal {
public:
    void hacerSonido() override {
        std::cout << "El perro ladra." << std::endl;
    }
};

class Gato : public Animal {
public:
    void hacerSonido() override {
        std::cout << "El gato maúlla." << std::endl;
    }
};

int main() {
    Animal* animales[] = {new Perro(), new Gato()};
    for (Animal* animal : animales) {
        animal->hacerSonido();
    }
    return 0;
}

C#:

C#
using System;

class Animal {
    public virtual void HacerSonido() {
        Console.WriteLine("El animal hace un sonido.");
    }
}

class Perro : Animal {
    public override void HacerSonido() {
        Console.WriteLine("El perro ladra.");
    }
}

class Gato : Animal {
    public override void HacerSonido() {
        Console.WriteLine("El gato maúlla.");
    }
}

class Program {
    static void Main(string[] args) {
        Animal[] animales = {new Perro(), new Gato()};
        foreach (Animal animal in animales) {
            animal.HacerSonido();
        }
    }
}

Java:

Java
class Animal {
    public void hacerSonido() {
        System.out.println("El animal hace un sonido.");
    }
}

class Perro extends Animal {
    @Override
    public void hacerSonido() {
        System.out.println("El perro    ladra.");
    }
}

class Gato extends Animal {
    @Override
    public void hacerSonido() {
        System.out.println("El gato maúlla.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal[] animales = {new Perro(), new Gato()};
        for (Animal animal : animales) {
            animal.hacerSonido();
        }
    }
}

Python:

Python
class Animal:
    def hacer_sonido(self):
        print("El animal hace un sonido.")

class Perro(Animal):
    def hacer_sonido(self):
        print("El perro ladra.")

class Gato(Animal):
    def hacer_sonido(self):
        print("El gato maúlla.")

animales = [Perro(), Gato()]
for animal in animales:
    animal.hacer_sonido()

Explicación:

En estos ejemplos, la clase base Animal tiene un método hacerSonido(). Las clases derivadas Perro y Gato sobreescriben este método para proporcionar una implementación específica. Al crear un arreglo de objetos Animal y llamar al método hacerSonido() en cada uno, el comportamiento real depende del tipo real del objeto en tiempo de ejecución. Esto demuestra el polimorfismo dinámico.

¿Por qué es importante el polimorfismo?

  • Flexibilidad: Permite escribir código más genérico y reutilizable.
  • Extensibilidad: Facilita la adición de nuevas clases sin modificar el código existente.
  • Mantenibilidad: Hace que el código sea más fácil de entender y mantener.


Comentarios

Entradas más populares de este blog

Tratamiento de excepciones

Agregación

Composición